字节流返回奇怪的字符?

时间:2009-02-06 07:53:04

标签: c# character-encoding bytearray

当尝试在文本框中显示来自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在每个日志行流结束时。用Environment.NewLine替换\ n,用string.Empty替换\ 0,奇怪的字符消失了。谢谢Jon。

3 个答案:

答案 0 :(得分:1)

  1. 您确定数据是纯ASCII吗?它可能是许多代码页中的一个吗?
  2. 可能是因为[CR] vs [LF] vs [CR] [LF]?
  3. 你能说出使用“玩家......”周围的字节吗?你期望看到什么?我们可能能够识别代码页
  4. 大概该字节位于代码页区域(128-255)或控制字符(0-31)中。

答案 1 :(得分:1)

您可能必须使用文本框理解的换行符手动替换它们,否则您可能必须使文本框成为多行文件(如果尚未完成)。

Geekpedia说要确保你设置:

TextBox1.MultiLine = true

回复后:

如果某些角色不是CRLF,那么你需要检查一下你是如何获得它们的。

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

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

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

答案 2 :(得分:1)

首先,我相信如果文本框收到一个字符0,他们会认为这是数据的结尾 - 你可能想要特别防范它。

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