将十六进制转换为二进制并通过网络发送

时间:2014-04-28 23:10:36

标签: bash hex pipe netcat xxd

我需要从stdin读取十六进制数据,将其转换为二进制,使用netcat发送,接收回复,转换回十六进制并打印到stdout。我这样做:

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

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

1 个答案:

答案 0 :(得分:2)

默认情况下,大多数* nix实用程序在交互模式下会进行行缓冲(例如stdin / stdout直接连接到终端仿真器)。但是当处于非交互模式时(例如stdin / stdout连接到管道)通常使用更大的缓冲区 - 我认为8k左右是典型的,但这在很大程度上取决于实现/发布。

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

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