2012-02-10 27 views
5

Quiero convertir un archivo binario en una cadena que luego podría convertirse de nuevo en el archivo binario. He intentado esto:conversión de bytes a una cadena C#

byte[] byteArray = File.ReadAllBytes(@"D:\pic.png"); 
for (int i = 0; i < byteArray.Length; i++) 
{ 
    textBox1.Text += (char)byteArray[i]; 
} 

pero es demasiado lento, que tarda unos 20 segundos para convertir en 5 KB CPU i5. Noté que el bloc de notas hace lo mismo en mucho menos tiempo. ¿Alguna idea sobre cómo hacerlo?

Gracias

Respuesta

15

Si usted quiere ser capaz de convertir de nuevo a binario sin perder la información, que no debería estar haciendo este tipo de cosas en todos - se debe utilizar la codificación base64 o algo similar:

textBox1.Text = Convert.ToBase64String(byteArray); 

Luego puede convertir de nuevo usando byte[] data = Convert.FromBase64String(text);. Lo importante es que base64 convierte datos binarios arbitrarios en texto ASCII conocido; todas las secuencias de bytes son válidas, todas se pueden disparar en redondo, y como solo requiere ASCII, es amigable para muchos transportes.

Hay cuatro cosas importantes a tomar distancia aquí:

  • no tratan a los datos binarios arbitrarios, como si se tratara de texto válido en una codificación particular. Phil Haack wrote about this in a blog post recently, en respuesta a algunas de mis respuestas SO.
  • Don't perform string concatenation in a loop; use un StringBuilder si quiere crear una cadena final entre muchos bits, y no sabe cuántos bits por adelantado
  • No use las propiedades de la interfaz de usuario en un bucle innecesariamente, incluso si los pasos previos fueron correctos, que habría sido mejor para construir la cadena con un bucle y luego hacer una sola asignación a la propiedad Text
  • más información sobre los System.Text.Encoding para la situación en la que realmente tiene obtuve texto codificado; Encoding.UTF8.GetString(byteArray) habría sido apropiado si esto se había datos codificados en UTF-8, por ejemplo
+1

¿Cómo previene el ToBase64String la pérdida de información? –

+0

@Brad: porque puede usar 'Convert.FromBase64String' para recuperarlo más tarde ... –

+0

Entonces, la idea es simplemente usar la misma codificación y la Base 64 es la más genérica en comparación con UTF8, 16, etc. ..? –