gpt4 book ai didi

c# - Telnet 流的字节到字符转换

转载 作者:行者123 更新时间:2023-12-02 11:11:48 25 4
gpt4 key购买 nike

我通过 TcpClient.GetStream().ReadByte() 从 telnet session 获取字节数据流。然后我通过 char 转换将此字节数据转换为 ASCII。数据传输正常,但有很多额外的垃圾,例如 1[01;001H[0k[01.

有人知道这些额外的垃圾是什么吗?

更新下面有更详细的响应流

1[01;001H[0K[01;017H[0;1;4m此处页面标题[0;1m[0;1m[02;001H[02;051H[0KWed 2012年3月28日下午3:03] 02;051HD此处日期时间[0J[03;001H[0J[23;001H[0J[0;1;7m此处提示]]-- [0;1m[23;044H

什么时候应该读取

此处的页面标题这里的日期时间

此处提示

最佳答案

您看到的部分“垃圾”是 Telnet 协议(protocol)的一部分。 Remote 正在尝试与您协商一些选项,并且还可能向您发送一些其他命令(尽管这在实践中相对较少)。有关所有可能命令的确切格式和含义,请参阅 applicable RFCTELNET COMMAND STRUCTURE 部分。

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

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

顺便说一句,实际上没有必要太深入地研究规范:使用像 minimalistic Telnet library 这样的预先构建的东西来处理最重要的细节是完全可行的。

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

此处最简单的选项:一旦看到 ESCape 字符 (ASCII 27),请忽略此后的所有内容,包括第一个不在列表 [;0123456789 中的字符。这将剥离最常见的 VT100 代码:有一些代码可能需要特殊处理,但这些代码很少见,无论如何,您现在已经有了规范。

但是,即使您剥离控制代码,您仍然可能会得到无法解析的数据流,特别是如果主机试图维护精美的屏幕布局。例如,它可能会随机更新您感兴趣的值流中间的状态字段(例如时钟)。如果是这种情况,您将需要一个(虚拟)VT100 模拟器附件屏幕抓取工具。这类解决方案似乎大多涉及昂贵的商业软件,尽管 libvt100 - A purely .net/C# library for parsing a VT100/ANSI stream 可能适合您。

关于c# - Telnet 流的字节到字符转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9913342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com