Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

TextBox1.MultiLine = true

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top