2013-10-21 2 views
0

필자는 필자가 필요로하는 작은 16 진수 뷰어를 작성하고 있습니다. 표준 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. 코드가 끔찍하다는 것을 압니다 만, 생산물을 보지 못할 것입니다. 그것은 내 자신의 분석 도구 일뿐입니다.

+0

글쎄, 인쇄 할 수없는 문자는 인쇄 할 수 없습니다. ASCII 7과 같은 것들은 실제로 그것을 표현하기위한 문양이 없습니다. '.'표시를 시도하십시오. 대신. –

+0

Encoding.Unicode.GetString ...을 시도하십시오. 또한 하드 코딩 된 텍스트를 레이블에 설정하려고합니다. 배경에있을 수도 있습니다. – VladL

+0

16 진수를 표시하려면 실제로 바이트를 16 진수로 변환해야합니다. BitConverter.ToString()을 사용하십시오. [이 답변] (http://stackoverflow.com/a/2426258/17034)에서 수행하는 샘플 코드를 찾을 수 있습니다. –

답변

0

문제를 재현 할 수 없습니다.

.NET Framework 4.5를 사용하여 새 Windows Forms 응용 프로그램을 만들었습니다. 양식에 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로 끝나는 문자열을 사용합니다. 즉, 0 바이트가 문자열의 끝으로 해석됩니다. 그래서 다음과 같은 프로그램이 실패 할당 후

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

True (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