0

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

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

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

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

4

1 回答 1

3
92 120 56 48 13 10

是十进制ASCII:

\  x   8  0  \r \n

所以你做错了,它不是 Telnet。转义序列\x80被逐字处理,而不是被理解为 code=128 的单个字符。

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

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

当然

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

--

从评论中总结出长篇大论:

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