字符串在字符 00H 之后停止追加

本文关键字:追加 之后 00H 字符 字符串 | 更新日期: 2023-09-27 18:37:08

我正在做一些实验,作为探索过程的一部分,我正在尝试编写一个程序,该程序将以与十六进制编辑器类似的方式呈现文件。

我使用 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 之后停止追加

在每一行旁边,我想以 ASCII 格式写入字节,但是当我遇到 00H 时,之后的所有文本都不会附加到字符串中。

是的 - 它只是没有显示在文本框中。(您还使用的是 ISO-8859-1,而不是 ASCII。ASCII 不包含任何重音字符等)

大多数 Windows 窗体控件都是 Win32 控件的非常薄的包装器,这些控件将 U+0000 视为字符串的末尾。

在第二段代码中,使用十六进制将字节转换为文本,然后可以看到数据在那里

基本上,您不应该尝试将非文本显示为文本。如果你真的,真的想这样做,我会用

text = text.Replace(''u0000', ' ');

以避免 Win32 控件"看到"Unicode NUL 字符并停止。