문제

TextBox에서 HLDS (Half-Life 전용 서버)의 바이트 스트림을 표시하려고 할 때 다음과 같은 모습을 보이는 이상한 블록 질문 마크 문자가 표시됩니다.

[?]

다음은 바이트 스트림 (이상한 문자 대신 [?]와 함께)의 샘플 라인입니다.

CPU   In    Out   Uptime  Users   FPS    Players[?] 0.00  0.97  0.91    2806   182  297.25       1[?]

바이트 스트림을 문자열로 표시하는 방법은 다음과 같습니다.

byte[] bytes = listener.Receive(ref sender); // get bytes from stream
TextBox1.Text = Encoding.ASCII.GetString(bytes, 0, bytes.Length); // write to textbox

캐릭터가 어디에 나타나고 있습니다 [CR][LF] 일반적으로 나타나야합니다. 왜 이상한 캐릭터를 보여주고, 이상한 캐릭터를 제거하거나 인코딩을 수정하기 위해 무엇을 할 수 있습니까?

***** UPDATE *****

Jon Skeet은 정답을 제공했습니다. 로그는 n Newline ( r n)의 경우 n, 각 로그 라인의 끝에서 0을 반환합니다. n Environment.newline으로 교체하고 0은 string.empty와 이상한 캐릭터가 사라졌습니다. 존 감사합니다.

도움이 되었습니까?

해결책

첫째, TextBox가 문자 0을 받으면 데이터의 끝이라고 가정 할 것입니다. 구체적으로 그에 대비하고 싶을 수도 있습니다.

바이트 스트림은 어디에서 왔습니까? 인코딩은 무엇입니까? 의미했다 되려고? 데이터의 그 시점에서 바이트는 무엇입니까?

다른 팁

  1. 데이터가 순수한 ASCII에 있다고 확신합니까? 아마도 많은 코드 페이지 중 하나일까요?
  2. 아마도 [cr] vs [lf] vs [cr] [lf] 때문일까요?
  3. "플레이어 ..."주변에있는 바이트를 사용한다고 말할 수 있습니까? 그리고 당신이 기대하는 것은 무엇입니까? 우리 ~할 것 같다 코드 페이지를 인식 할 수 있습니다

아마도 바이트는 코드 영역 (128-255) 또는 제어 문자 (0-31)에있을 것입니다.

텍스트 상자가 이해할 라인 브레이크 문자로 수동으로 교체해야 할 수도 있고, 텍스트 상자가 아직 없다면 멀티 라인을 만들어야 할 수도 있습니다.

괴짜 설정한지 확인하라고 말합니다.

TextBox1.MultiLine = true

응답 후 :

캐릭터 중 일부가 CRLF를 Aren'R 인 경우, 어떻게 얻는 지 살펴 봐야합니다.

실제 출력을보십시오 Encoding.ASCII.GetString() 그리고 거기에 무엇이 있는지 확인하십시오.

예제에있는 것들은 헤더를 데이터 라인에서 분리하기 때문에 명확하게 라인 엔드 문자입니다. CRLF는 멀티 라인 텍스트 상자에서 작동해야하므로 바이트 내용을 확인할 때까지 무슨 일이 일어나고 있는지 확실하지 않습니다. 다른 문자는 공백으로 대체 될 수 있습니다 (즉 하나의 옵션).

그리고이 텍스트 상자의 글꼴이 고정 될 것이라고 가정합니다. 그렇지 않으면 잘 정렬되지 않기 때문에 비례하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top