2013-10-21 128 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