Странные символы возвращаются из потока байтов? - PullRequest
0 голосов
/ 06 февраля 2009

При попытке отобразить поток байтов с HLDS (Half-Life Dedicated Server) в текстовом поле он отображает странные блочные символы вопросительного знака, которые выглядят примерно так:

[?]

Вот пример строки из потока байтов (с [?] Вместо странного символа):

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 *****

Джон Скит дал правильный ответ. Журналы возвращают \ n для новой строки (не \ r \ n) и \ 0 в конце каждой строки журнала. Заменены \ n на Environment.NewLine и \ 0 на string.Empty и странные символы исчезли. Спасибо Джон.

Ответы [ 3 ]

1 голос
/ 06 февраля 2009

Возможно, вам придется заменить их вручную символами разрыва строки, которые будет понимать текстовое поле, или вам может потребоваться сделать текстовое поле многострочным, если это еще не сделано.

Geekpedia говорит просто убедиться, что вы установили:

TextBox1.MultiLine = true

После ответа:

Если некоторые персонажи не являются CRLF, вам нужно проверить, как вы их получаете.

Посмотрите на фактический вывод Encoding.ASCII.GetString() и посмотрите, что там.

В вашем примере это символы конца строки, поскольку они отделяют заголовок от строки данных. CRLF должен работать в многострочных текстовых полях, поэтому я не уверен, что там происходит (пока вы не проверите содержимое байтов) - другие символы могут быть заменены пробелами (это один из вариантов).

И я предполагаю, что шрифт этого текстового поля будет фиксированным, а не пропорциональным, так как в противном случае он не выстроится в линию очень хорошо.

1 голос
/ 06 февраля 2009

Во-первых, я считаю, что если текстовые поля когда-либо получат символ 0, они будут предполагать, что это конец данных - вы, возможно, захотите защититься от этого конкретно.

Откуда берется ваш поток байтов? Какая кодировка означает ? Какие байты в этой точке данных?

1 голос
/ 06 февраля 2009
  1. Вы уверены, что данные в чистом ASCII? Это возможно в одной из множества кодовых страниц?
  2. Возможно, это из-за [CR] против [LF] против [CR] [LF]?
  3. Можете ли вы сказать, использовать байты вокруг "Players ..."? И что вы ожидаете увидеть? Мы можем быть в состоянии распознать кодовую страницу

Предположительно, байт находится либо в зоне кодовой страницы (128-255), либо в управляющих символах (0-31).

...