当尝试在文本框中显示来自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。
答案 0 :(得分:1)
大概该字节位于代码页区域(128-255)或控制字符(0-31)中。
答案 1 :(得分:1)
您可能必须使用文本框理解的换行符手动替换它们,否则您可能必须使文本框成为多行文件(如果尚未完成)。
Geekpedia说要确保你设置:
TextBox1.MultiLine = true
回复后:
如果某些角色不是CRLF,那么你需要检查一下你是如何获得它们的。
查看Encoding.ASCII.GetString()
的实际输出,看看那里有什么。
您示例中的那些显然是行尾字符,因为它们将标题与数据行分开。 CRLF应该在多行文本框中工作,所以我不确定那里发生了什么(直到你验证字节内容) - 其他字符可以用空格替换(这是一个选项)。
并且,我假设此文本框的字体将是固定的,而不是成比例的,否则它将不会很好地排列。
答案 2 :(得分:1)
首先,我相信如果文本框收到一个字符0,他们会认为这是数据的结尾 - 你可能想要特别防范它。
你的字节流来自哪里? 意味着的编码是什么?数据中该点的字节数是多少?