2009-02-06 3 views
0

При попытке отобразить поток байтов из 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 ***** 

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

ответ

1

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

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

+0

Приносим извинения за неспособность сформулировать этот вопрос очень хорошо. Поток байтов поступает из udp-клиента, отправленного из hlds (Half Life Dedicated Server). Из того, что я могу найти в Интернете, кодировка должна быть ASCII. Я попробую персонажа 0 и дам вам, ребята, знать ... но что-то говорит мне прав. – David

+0

Вот и все. Спасибо, Джон. – David

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

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

1

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

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

TextBox1.MultiLine = true 

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

Если некоторые из персонажей aren'r CRLF, то вам необходимо изучить, как вы получаете их.

Посмотрите на фактический результат от Encoding.ASCII.GetString() и посмотрите, что там находится.

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

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

+0

Текстовое поле уже многострочное. Я бы попытался заменить символы вручную, но некоторые из символов не являются CRLF, и, честно говоря, некоторые из них испортили мое приложение! Например, иногда, когда я получаю символ и пытаюсь его написать, он очищает текстовое поле. Спасибо за ответ. – David