我正在为自己的需要编写一个小小的十六进制查看器。陷入标准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属性后,它变为空字符串,并且不显示任何内容。
任何有关这方面的帮助都很可爱
P.S。我知道代码很糟糕,但它永远不会看到生产,它只是我自己的分析工具
答案 0 :(得分:0)
我无法重现你的问题。
我使用.NET Framework 4.5创建了一个新的Windows窗体应用程序,并在表单上放置了一个Label。然后我有以下代码:
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);