2013-10-21 60 views
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属性后,就变成只是一个空字符串,并没有显示。

对此的任何帮助将是可爱的

P.S.我知道代码是可怕的,但它永远不会看到生产,它只是我自己的分析工具

+0

那么,不可打印的字符是...不可打印。像ASCII 7这样的东西实际上没有代表它们的字形。尝试显示'。'代替。 –

+0

请尝试Encoding.Unicode.GetString ...。也尝试设置一些硬编码的文本到tghe标签,也许它只是在后台 – VladL

+0

如果你想显示十六进制,那么你必须实际将字节转换为十六进制。使用BitConverter.ToString()。你会发现在[这个答案](http://stackoverflow.com/a/2426258/17034)中都有的代码示例。 –

回答

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使用以空字符结尾的字符串,这意味着零字节将被解释为字符串的结尾。所以,下面的程序将失败:

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); 
+0

之后被清除。(char)7对我来说也很好。现在尝试这样做: byte [] arr = new byte [] {7,0,0x6c,0}; //例如 this.label1.Text = Encoding.ASCII.GetString(arr,0,arr.Length); 可能是因为\ 0字符... – schikin

+0

我已更新我的答案。 –

+0

是的,我得到了同样的结果。谢谢 – schikin