将字节转换为字符串 C#

5
我想将一个二进制文件转换成字符串,之后还能将其转回二进制文件。 我尝试了以下方法:
byte[] byteArray = File.ReadAllBytes(@"D:\pic.png");
for (int i = 0; i < byteArray.Length; i++)
{
    textBox1.Text += (char)byteArray[i];
}

但速度太慢了,使用i5 CPU转换5KB需要大约20秒。 我注意到记事本在更短的时间内完成相同的任务。 你有什么好的想法吗?

谢谢

1个回答

16

如果您想要在转换回二进制时不丢失任何信息,您根本不应该做这种事情 - 您应该使用base64编码或类似的方法:

textBox1.Text = Convert.ToBase64String(byteArray);

你可以使用 byte[] data = Convert.FromBase64String(text); 将base64编码的文本转换回二进制数据。重要的是,base64将任意二进制数据转换为已知的ASCII文本;所有字节序列都是有效的,都可以进行轮换,而且它只需要ASCII,因此对于许多传输方式都很友好。

这里有四个重要的要点:

  • 不要将任意二进制数据视为特定编码中的有效文本。Phil Haack最近在博客中写到了这一点,以回应我的一些SO答案。
  • 不要在循环中执行字符串连接操作;如果你想从许多位创建一个最终字符串并且你事先不知道有多少位,则使用StringBuilder
  • 不必在循环中不必要地使用UI属性-即使前面的步骤没有问题,使用循环构造字符串然后对Text属性进行单次赋值会更好
  • 学习有关System.Text.Encoding的知识,它适用于你真正拥有编码文本的情况;例如,如果这是UTF-8编码数据,则会使用Encoding.UTF8.GetString(byteArray)

@Brad:因为你随后可以使用 Convert.FromBase64String 将其转换回来... - Jon Skeet
那么这个想法就是只需使用相同的编码方式,而 Base 64 相对于 UTF8、16 等来说最通用? - Brad Semrad
1
@Brad:它们不是同一件事。Encoding.UTF8等用于将任意文本表示为字节... Base64用于将任意二进制数据表示为文本。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接