2012-02-10 20 views
5

Voglio convertire un file binario in una stringa che può essere quindi riconvertita nel file binario. Ho provato questo:conversione di byte in una stringa C#

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

ma è troppo lento, ci vogliono circa 20 secondi per convertire i 5 KB su CPU i5. Ho notato che il blocco note fa lo stesso in molto meno tempo. Qualche idea su come farlo?

Grazie

risposta

15

Se si vuole essere in grado di riconvertire in binario senza perdere alcuna informazione, non si dovrebbe fare questo genere di cose a tutti - si dovrebbe utilizzare la codifica Base64 o qualcosa di simile:

textBox1.Text = Convert.ToBase64String(byteArray); 

È quindi possibile riconvertire utilizzando byte[] data = Convert.FromBase64String(text);. L'importante è che base64 converta dati binari arbitrari in testo ASCII noto; tutte le sequenze di byte sono valide, tutte possono essere rotte e, poiché richiede solo ASCII, è amichevole con molti trasporti.

Ci sono quattro cose importanti da prendere via qui:

  • non trattano dati binari arbitrari, come se si trattasse di testo valido in una particolare codifica. Phil Haack wrote about this in a blog post recently, in risposta ad alcune delle mie risposte SO.
  • Don't perform string concatenation in a loop; utilizzare un StringBuilder se si desidera creare una stringa finale con un sacco di bit e non si conosce quanti bit in anticipo
  • Non utilizzare le proprietà dell'interfaccia utente in un ciclo inutilmente, anche se i passaggi precedenti erano corretti, sarebbe stato meglio per costruire la stringa con un ciclo e poi fare un unico assegnazione alla proprietà Text
  • Informazioni sui System.Text.Encoding per la situazione in cui si ha realmente avete preso codificato testo; Encoding.UTF8.GetString(byteArray) sarebbe stato appropriato se questo fosse stato i dati UTF-8-encoded, ad esempio
+1

Come funziona il ToBase64String prevenire la perdita di informazioni? –

+0

@Brad: perché puoi quindi utilizzare 'Convert.FromBase64String' per ripristinarlo più tardi ... –

+0

Quindi l'idea è quindi usare solo la stessa codifica e Base 64 è la più generica in combinazione con UTF8, 16, ecc. ..? –

Problemi correlati