ste*_*ris 2 c# byte ascii telnet
我通过telnet会话获得字节数据流TcpClient.GetStream().ReadByte().然后我通过char强制转换将此字节数据转换为ASCII .数据很好,但有很多额外的垃圾1[01;001H[0k[01.
任何人都知道这个额外的垃圾可能是什么?
更新下面更详细的回复流
1 [001; 001H [0K [01; 017H [0; 1; 4mTitle of Page Here [0; 1m [0; 1m [02; 001H [02; 051H] [0KWed Mar 28,2012 03:03 pm [02; 051HDate时间[0J [03; 001H [0J [23; 001H [0J [0; 1; 7m提到这里[P] - [0; 1m [23; 044H]
什么时候应该读
页面标题在这里日期时间
提示在这里
您所看到的"垃圾"部分是Telnet协议的一部分.遥控器试图与你协商一些选项,也可能会发给你一些其他命令(尽管这在实践中相对较少).有关所有可能命令的确切格式和含义,请参阅适用RFC的TELNET COMMAND STRUCTURE部分.
在大多数情况下,您将能够简单地忽略收到的任何Telnet命令(包括选项协商),但您必须对它们进行过滤:正如您所发现的那样,将Telnet会话视为干净的TCP流将无法正常工作.
除了协议级选项之外,远程还可以假设您是终端,并发送转义序列以确保正确显示数据.解释或过滤这些代码将取决于远程配置使用的终端类型 - 例如,您不会遇到VT100.
顺便说一下,没有必要深入研究规范:使用像这个简约的Telnet库预先构建的东西来处理最重要的细节是完全可行的.
编辑,2012年3月29日:您看到的"垃圾"的其他示例确认遥控器将您视为VT100.例如:[0;1;4mTitle of Page Here对应Set Attribute Mode: <ESC>[{attr1};...;{attrn}m并尝试使页面标题显得明亮(1)和下划线(4).
这里最简单的选择:只要看到一个ESCape字符(ASCII 27),就在此之后忽略所有内容,包括列表中没有的第一个字符[;0123456789.这将删除最常见的VT100代码:有一些可能需要特殊处理,但这些是罕见的,无论如何,你现在有规格.
但即使您剥离控制代码,您仍可能最终得到一个不可解析的数据流,尤其是当主机试图保持精美的屏幕布局时.例如,它可以在您感兴趣的值流中间随机更新状态字段(例如时钟).如果是这种情况,您将需要(虚拟)VT100仿真器附件屏幕刮刀.这些解决方案似乎主要涉及昂贵的商业软件,尽管libvt100 - 用于解析VT100/ANSI流的纯.net/C#库可能对您有用.
| 归档时间: |
|
| 查看次数: |
2015 次 |
| 最近记录: |