2012-03-28 53 views
2

我通过TcpClient.GetStream().ReadByte()从telnet会话获取字节数据流。然后,我通过char转换将此字节数据转换为ASCII。数据通过很好,但有很多额外的垃圾,如1[01;001H[0k[01.Telnet流的字节到字符转换

任何人都知道这个额外的垃圾可能是什么? 001H [0K [01; 017H [0;

UPDATE 下面

1 [01更详细的反应流1; 1M [0;; 1M [02; 001H [02页以下[0的4mTitle; 051H [0; 03; 001H [0J [23; 001H [0J [0; 1; 7mPrompt Here [P] - [0; 1m [23; 044H

当它应该阅读

扉页这里 日期时间这里

提示这里

+1

请显示您的当前代码。 – Yuck 2012-03-28 18:15:29

+0

你的问题不清楚。为什么通过char转换来转换它,有一些方法可以将整个byte []的字符串转换为字符串。你似乎不明白正在传输什么。 – 2012-03-28 18:16:35

+0

你确定你的输入数据只包含ASCII字符吗? – 2012-03-28 18:17:15

回答

6

你看到的'垃圾'部分是Telnet协议的一部分。遥控器正试图与你协商一些选择,并可能会向你发送一些其他命令(尽管在实践中这是相对罕见的)。有关所有可能命令的确切格式和含义,请参阅applicable RFCTELNET COMMAND STRUCTURE部分。

在大多数情况下,您可以简单地忽略收到的任何Telnet命令(包括选项协商),但您必须对其进行过滤:正如您发现的,仅将Telnet会话视为干净的TCP流,工作。

除协议级选项外,远程设备还可以假设您是终端设备,并发送转义序列以确保数据正确显示。解释或过滤这些代码将取决于远程配置使用的终端类型 - 例如,您不会遇到VT100

顺便说一句:使用像minimalistic Telnet library这样的预制件来处理最重要的细节是完全可行的。

编辑,2012年3月29日:你看到的'垃圾'的其他例子证实,遥控器将你视为VT100。例如:[0;1;4mTitle of Page Here对应于Set Attribute Mode: <ESC>[{attr1};...;{attrn}m并尝试使页面标题显示为亮(1)并加下划线(4)。

这里最简单的选择:只要你看到一个ESCape字符(ASCII 27),忽略之后的所有内容,直到包括不在列表中的第一个字符[;。这将剥离最常见的VT100代码:有一些可能需要特殊处理,但这些很少见,并且无论如何,现在您都有规格。

但即使你去掉了控制代码,你仍然可能会得到一个不可解析的数据流,特别是如果主机试图维持一个奇特的屏幕布局。例如,它可以随意更新您感兴趣的值流中间的状态字段(例如时钟)。如果是这种情况,您需要一个(虚拟)VT100仿真器附件屏幕刮取器。这些解决方案大多数似乎涉及昂贵的商业软件,虽然libvt100 - A purely .net/C# library for parsing a VT100/ANSI stream可能适合你。

+0

其实,简约的Telnet正是我用的。我已经调整它也只显示31到128之间的字节流的十进制值以及特殊字符,如用于格式化的制表符和换行符。尽管如此,我仍然收到垃圾数据。也许这是终端转义序列?我将如何检查?另外,上面我将更详细地添加输出示例。 – steventnorris 2012-03-28 18:49:47

+0

是否有任何表示转义序列结束的内容?我看到字节27在格式数据前出现,但结尾字节看起来不一样。我唯一担心的可能是剪掉我需要的一些信息。在序列中也使用h,m和其他几个。我宁愿要摆脱那些垃圾邮件中的垃圾邮件,但不要放在我的一般ASCII显示屏中(我需要能够准确地解析响应)。 – steventnorris 2012-03-29 14:23:40

+1

我在这里找到了一个ASCII ANSI转义序列列表:http://ascii-table.com/ansi-escape-sequences-vt-100.php我应该能够使用这个过滤掉转义字节后的确切序列。谢谢各位的帮助!我不知道这混乱是从哪里来的。 – steventnorris 2012-03-29 15:09:01