0

我正在为自己的需要编写一个小型十六进制查看器。陷入标准 Label 控件不会在字符串中显示不可打印字符的情况:

public string ToASCIIstring(int numColumns)
{
    string ret = String.Empty;
    int stringBegin = 0;

    for (int i = 0; i < Data.Length; i++)
    {
        int colNum = i % numColumns;

        if ((colNum + 1 == numColumns) || (i == Data.Length -1 ))
        {
            ret += Encoding.ASCII.GetString(Data, stringBegin, colNum);
            stringBegin = i + 1;
            ret += "\n";
        }
    }

    return ret;
}

此方法返回正确的 ASCII 字符串,但在将其分配给 Label.Text 属性后,它变成了一个空字符串,并且没有显示任何内容。

任何帮助都会很可爱

PS我知道代码很糟糕,但它永远不会看到生产,它只是我自己的分析工具

4

1 回答 1

0

我无法重现您的问题。

我使用 .NET Framework 4.5 创建了一个新的 Windows 窗体应用程序,并在窗体上放置了一个标签。然后我有以下代码:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    string s = ((char)7).ToString();

    this.label1.Text = s;

    Debug.Assert(this.label1.Text == s);
}

正如预期的那样,它运行得很好。使用默认字体,这将显示一个细项目符号。

我的猜测是出现了与不可打印的 ASCII 字符无关的其他问题。

更新:但是,标签后面的 Windows API 使用以 null 结尾的字符串,这意味着零字节将被解释为字符串的结尾。所以下面的程序失败了:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    var bytes = new byte[] { 7, 0, 0x6c, 0 };

    string s = Encoding.ASCII.GetString(bytes);

    this.label1.Text = s;

    Debug.Assert(this.label1.Text == s);
}

赋值后,Label.Text 属性包含一个长度为 1 的字符串,只包含 ASCII 码为 7 的字符。

但这有效:

    var bytes = new byte[] { 7, 0, 0x6c, 0 };

    string s = Encoding.ASCII.GetString(bytes).Replace((char)0, '.');

    this.label1.Text = s;

    Debug.Assert(this.label1.Text == s);
于 2013-10-22T07:44:16.627 回答