【问题标题】:Convert hex to binary and send it over network将十六进制转换为二进制并通过网络发送
【发布时间】:2014-04-28 23:10:36
【问题描述】:

我需要从标准输入读取十六进制数据,将其转换为二进制,使用netcat 发送,接收回复,转换回十六进制并打印到标准输出。我愿意:

# xxd -r -p | nc -u localhost 12345 | xxd

然后以十六进制输入我的数据并按 Enter。但是直到我按Ctrl+D 才发送,所以收到回复后我无法发送另一个数据包。看起来xxd -r -p 不写入二进制数据,直到给出EOF。有没有办法让它写在换行符之后?

【问题讨论】:

  • 为什么需要以二进制形式发送?十六进制应该可以正常工作。二进制实际上是将所需的字节数乘以 4(十六进制是每字节 2 次,二进制是每字节 8,2/8=4)
  • @phyrrus9 我认为“二进制”的 OP 定义是 8 位字节流,而不是 ascii 1 和 0 流。例如,尝试echo 737461636b6f766572666c6f772e636f6d0a | xxd -p -r

标签: bash hex pipe netcat xxd


【解决方案1】:

默认情况下,大多数 *nix 实用程序将在交互模式下进行行缓冲(例如,直接连接到终端仿真器的 stdin/stdout)。但是在非交互模式下(例如连接到管道的标准输入/标准输出)通常使用更大的缓冲区 - 我认为 8k 左右是典型的,但这在很大程度上因实现/发行版而异。

如果您有可用的GNU stdbuf utility,您可以将给定进程的缓冲强制为行模式:

stdbuf -oL xxd -r -p | nc -u localhost 12345 | xxd

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2016-08-28
    • 2013-07-25
    • 2023-03-25
    相关资源
    最近更新 更多