【发布时间】:2016-06-14 21:15:48
【问题描述】:
我正在做一些实验,作为探索过程的一部分,我正在尝试编写一个程序,该程序将以与十六进制编辑器类似的方式呈现文件。
我使用FileStream 加载文件并将所有字节写入字节数组。然后,我循环遍历数组并以十六进制格式将字节写入块中,块的宽度由我选择(在本例中为 16 个字节)。
在每一行旁边,我想以 ASCII 格式写入字节,但是当我遇到 00H 时,之后的所有文本都没有附加到字符串中。
循环遍历字节的代码如下:
while (j < data.Length - 1)
{
for (int i = 0; i <= blockWidth - 1; i++)
{
if (j < data.Length - 1)
{
byteBlock[i] = data[j];
charBlock[i] = Convert.ToChar(data[j]); //ASCII Characters to be appended
j += 1;
}
}
sTemp = new string(charBlock);
hex += BitConverter.ToString(byteBlock) + " " + sTemp;//bug-causing line
hex += Environment.NewLine;
}
textBox1.Text = hex;
textBox1 中的文字只有以下一行:
D0-CF-11-E0-A1-B1-1A-E1-00-00-00-00-00-00-00-00 ÐÏࡱá
十六进制数据有 16 个字节,只有 8 个 ASCII 字符(其中 2 个未显示在此页面上)。
我添加了一些断点并单步执行代码,循环运行到最后没有问题。
当我像这样注释掉将sTemp 添加到hex 的部分时:
sTemp = new string(charBlock);//Output confirms the bug is not in this line
hex += BitConverter.ToString(byteBlock);// +" " + sTemp;//bug-causing line
hex += Environment.NewLine;
我得到以下输出:
D0-CF-11-E0-A1-B1-1A-E1-00-00-00-00-00-00-00-00
00-00-00-00-00-00-00-00-3E-00-03-00-FE-FF-09-00
06-00-00-00-00-00-00-00-00-00-00-00-01-00-00-00
01-00-00-00-00-00-00-00-00-10-00-00-02-00-00-00
03-00-00-00-FE-FF-FF-FF-00-00-00-00-00-00-00-00
FF-FF-FF-FF-FF-FF-FF-FF-FF-FF-FF-FF-FF-FF...
有人可以向我解释为什么会发生这种情况以及我应该做些什么来解决它吗?
【问题讨论】:
-
理想情况下,
00H不应使用string打印。您可以考虑替换,例如将其打印为\0或将NotePad++打印为NUL。此外,在ASCII/UTF-8中不能打印的不仅仅是00H。您可能需要为此创建一个完整的字典。 ASCII 至少有 33 chars non-printable。