我想将二进制文件转换为 ascii 字符数组。我怎样才能做到这一点 。谢谢你 。
5 回答
这取决于你想用它做什么。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 是更合适的技术。