我正在做一些实验,作为探索过程的一部分,我正在尝试编写一个程序,以十六进制编辑器的方式呈现类似的文件。
我使用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...
有人可以向我解释为什么会发生这种情况,还有我应该做些什么来解决这个问题?
答案 0 :(得分:2)
在每行的旁边,我想以ASCII格式写入字节,但是当我遇到00H时,之后的所有文本都没有附加到字符串中。
是的 - 它只是没有显示在文本框中。 (您还使用ISO-8859-1,而不是ASCII .ASCII不包含任何重音字符等。)
大多数Windows窗体控件都是Win32控件上的非常薄的包装器,那些将U + 0000视为字符串的结尾。
在第二段代码中,使用十六进制将字节转换为文本,然后您可以看到数据 。
基本上,您不应该尝试显示非文本,就好像它的文字一样。如果你真的,真的想这样做,我只是使用
text = text.Replace('\u0000', ' ');
避免来自&#34;看到&#34;的Win32控制一个Unicode NUL字符并停止。