【问题标题】:String stops appending after char 00H字符串在 char 00H 后停止附加
【发布时间】: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

标签: c# string char hex


【解决方案1】:

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

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

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

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

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

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

避免 Win32 控件“看到”Unicode NUL 字符并停止。

【讨论】:

  • 谢谢,这行得通。我没有显示非文本字符的迫切需要,我只需要一种方法来显示这些字节的占位符,您刚才向我展示了它。无论如何,这些数据中的大部分都不打算显示为文本,只是为了让我更好地了解正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2017-08-21
  • 2013-01-04
  • 1970-01-01
  • 2020-09-06
  • 2018-12-15
  • 2015-01-04
相关资源
最近更新 更多