0

当试图在文本框中显示来自 HLDS(半条命专用服务器)的字节流时,它会显示奇怪的块状问号字符,如下所示:

[?]

这是字节流中的示例行(用 [?] 代替奇怪的字符):

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 并且奇怪的字符消失了。谢谢乔恩。

4

3 回答 3

1
  1. 你确定数据是纯ASCII的吗?它可能在众多代码页之一中吗?
  2. 可能是因为 [CR] vs [LF] vs [CR] [LF]?
  3. 你能告诉使用“玩家......”周围的字节吗?你期望看到什么?我们也许能够识别代码页

推测该字节位于代码页区域 (128-255) 或控制字符 (0-31) 中。

于 2009-02-06T07:56:39.037 回答
1

您可能必须用文本框可以理解的换行符手动替换它们,或者如果还没有,您可能必须使文本框变成多行。

Geekpedia说只要确保你设置:

TextBox1.MultiLine = true

回复后:

如果某些字符不是 CRLF,那么您需要检查如何获取它们。

查看实际输出Encoding.ASCII.GetString(),看看里面有什么。

您示例中的那些显然是行尾字符,因为它们将标题与数据行分开。CRLF 应该在多行文本框中工作,所以我不确定那里发生了什么(直到您验证字节内容) - 其他字符可能被替换为空格(这是一个选项)。

而且,我假设这个文本框的字体是固定的,而不是成比例的,否则它不会很好地排列。

于 2009-02-06T07:57:40.220 回答
1

首先,我相信如果文本框曾经收到一个字符 0,他们会认为这是数据的结尾——你可能想要特别注意这一点。

你的字节流来自哪里?它意味着什么编码?数据中那个点的字节是多少?

于 2009-02-06T08:08:14.613 回答