2012-02-10 208 views
5

我想一個二進制文件轉換爲字符串,可以再轉換回二進制文件。 我嘗試這樣做:字節轉換爲字符串C#

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

但它太慢了,它需要大約20秒至5KB轉換i5的CPU上。 我注意到記事本在更短的時間內也能做到這一點。 關於如何做的任何想法?

感謝

回答

15

如果你想能夠回到轉換爲二進制,而不會丟失任何信息,你不應該在所有做這樣的事情 - 你應該使用base64編碼或類似的東西:

textBox1.Text = Convert.ToBase64String(byteArray); 

然後可以轉換回用byte[] data = Convert.FromBase64String(text);。重要的是base64將任意二進制數據轉換爲已知的ASCII文本;所有字節序列都是有效的,所有字節序列都可以進行往返,因爲它只需要ASCII碼,所以對許多傳輸都很友好。

有帶走這裏重要的事情:

  • ,就好像它是在一個特定的編碼有效文本不要把任意的二進制數據。菲爾·哈克wrote about this in a blog post recently,迴應我的一些答案。
  • Don't perform string concatenation in a loop;使用StringBuilder,如果你想創建一個最終的串出許多位的,你不知道有多少位提前
  • 在一個循環中不必要不要使用UI特性 - 即使前面的步驟都沒事,這本來是更好地構建一個循環的字符串,然後做一個分配到Text財產
  • 瞭解System.Text.Encoding對於您真的得到編碼文本的情況; Encoding.UTF8.GetString(byteArray)本來適當如果這一直是UTF-8編碼的數據,例如
+1

怎樣的ToBase64String防止信息丟失? – 2012-02-10 15:38:51

+0

@Brad:因爲你可以再使用'Convert.FromBase64String'再次找回來後... – 2012-02-10 15:40:35

+0

這樣的想法是那麼就使用相同的編碼和基地comparsion爲UTF8,16,64等是最通用的..? – 2012-02-10 15:43:33