【发布时间】:2009-05-29 14:51:40
【问题描述】:
我想将二进制文件转换为 ascii 字符数组。我怎样才能做到这一点 。 谢谢。
【问题讨论】:
-
请提供更多信息?
-
我假设您只是在谈论可打印的字符。并非所有 256 个 ASCII 字符都是可打印的。
-
这些问题让我想起了en.wikipedia.org/wiki/…
我想将二进制文件转换为 ascii 字符数组。我怎样才能做到这一点 。 谢谢。
【问题讨论】:
这取决于你想用它做什么。 Ascii 应该是 7 位(0-127 定义明确,其他字符取决于代码页)。所以普通的 ASCII 编码可能会导致令人讨厌的意外(其中包括不可打印的字符作为空值......)
如果你想从你的字节数组中打印一些东西,你不应该用 ASCII 编码来转换它们。您最好使用 Base64 对其进行编码,这是一种在字符串中编码二进制文件的安全(尽管在大小方面不是太理想)的方式。
要在 Base64 中编码您的字节,您可以使用:
string result = System.Convert.ToBase64String(yourByteArray);
【讨论】:
查看 BASE64 或 UUEncoding。我假设您只想使用 256 字符 ASCII 集中的可打印字符。
BASE64 仅使用 64 个字符(例如,有时在通过电子邮件发送二进制文件时使用此字符)。这会导致输出的大小增加 - 您必须根据自己的情况考虑这一点。
【讨论】:
StreamReader reader = new StreamReader("pathtoyourbinaryfile", System.Text.Encoding.ASCII);
char[] text = reader.ReadToEnd().ToCharArray();
【讨论】:
您可以读取每个字符并将其转换为字符。这会将每个字节转换为一个 ascii 字符。这就是你想要做的吗?
【讨论】:
我不相信较早的响应者回答了这个问题。很多人说 ASCII 是指字节,所以我怀疑提问者想要读取二进制文件而不是带有编码字符的文本文件。
为了展示不同技术的影响,我从以下字符串创建了一个 UTF-8 文本文件:
string s = "\ta£\x0394\x221A"; // tab; lower case a; pound sign; Greek delta; square root
以下程序首先将该文件作为文本字符串读取,然后作为字节数组读取。在每种情况下,它首先将输入显示为十进制,然后显示为十六进制。
String test = "";
String fileStg = File.ReadAllText("Test.txt");
for (int i = 0; i < fileStg.Length; i++)
test += (int)fileStg[i] + " ";
Debug.Print(test);
test = "";
for (int i = 0; i < fileStg.Length; i++)
test += ((int)fileStg[i]).ToString("X") + " ";
Debug.Print(test);
test = "";
Byte[] fileByte = File.ReadAllBytes(pathProg + "Test.txt");
for (int i = 0; i < fileByte.Length; i++)
test += fileByte[i].ToString() + " ";
Debug.Print(test);
test = "";
for (int i = 0; i < fileByte.Length; i++)
test += fileByte[i].ToString("X") + " ";
Debug.Print(test);
输出:
9 97 163 916 8730 13 10 9 61 A3 394 221A D A 239 187 191 9 97 194 163 206 148 226 136 154 13 10 EF BB BF 9 61 C2 A3 CE 94 E2 88 9A D A
请注意,当作为文本文件读取时,BOM 已被剥离,多字节 UTF-8 字符已成为输入字符串中的单个字符。但是当作为字节数组读取时,我会收到 BOM 和原始 UTF-8。
我怀疑提问者想要读取真正的二进制文件而不是 Unicode 文本文件,但我相信这个例子更好地说明了这两种技术的效果,并证明如果提问者想要读取二进制文件,那么 ReadAllBytes 是更多适当的技术。
【讨论】: