通过 bash 和 Telnet 发送不可打印的 ASCII 码(如 0x80)

Sending non-printable ASCII codes (like 0x80) through bash and Telnet

我正在尝试通过 telnet 将不可打印的 ASCII 字符(代码 128 - 255)发送到使用套接字对象读取数据的 Ruby 应用程序。

当我尝试通过 telnet 发送 \x80 时,我希望 Ruby 收到 3 个字节的字符串:128 13 10.

我实际上收到了一个 6 字节的字符串:92 120 56 48 13 10

我是否需要更改有关 telnet 发送信息的方式或 Ruby 套接字如何接受信息的方式?我已经通读了所有我能理解的 telnet 术语。非常感谢指出正确方向的观点。

92 120 56 48 13 10

十进制 ASCII:

\  x   8  0  \r \n

所以你做错了,不是 Telnet。转义序列 \x80 按字面意思处理,而不是被理解为 code=128.

的单个字符

我猜你用的是 '\x80' 而不是 "\x80"。注意不同的引号。如果那是单个字符,您可以在 Ruby 中也使用 ? 字符来表示一个字符:?\x80 例如:

"\x80\r\n" == ?\x80 + ?\r + ?\n
=> true

当然

'\x80\r\n' == "\x80\r\n"
=> false

--

从评论中总结长篇故事:

  • 原来要发送的数据是通过telnet终端手动输入的
  • telnet 终端通常不接受任何转义码,并且 "just send" 他们直接获得的所有内容,有时复制和粘贴带有特殊字符的文本有效,有时终端提供一些额外的 UI 好东西来发送特殊字符- 但这次终端非常基础,粘贴它不起作用,也没有 UI 好东西
  • 与手动输入数据相比,通过管道将文件发送到 telnet 终端似乎效果更好。收到了一些数据,但不是很好
  • 将数据通过管道传输到 nc(netcat) 而不是 telnet 终端似乎几乎可以工作,二进制数据已到达,但还不完美
  • 在使用 hexdump utility 检查输入文件(通过管道传输到 nc 的文件)后,发现该文件包含的内容与我们所想的不完全一样,似乎用于创建保存文件的编辑器编码错误的文本,并且添加了一些额外不需要的字节
  • 最后,utility called xxd 帮助从定制的十六进制文本中生成了良好的二进制数据; xxd 的输出可以直接传送到 nc (netcat)