Linux下实现收发十六进制字符的原生工具及nc命令问题问询
Linux原生替代RealTerm:和ucsim 8051模拟器的二进制通信方案
嘿,我完全懂你遇到的麻烦——Wine跑RealTerm动不动锁死,自带telnet又不好用。下面给你几个Linux原生的解决方案,从快速命令行修复到自定义脚本都有:
先解决nc发送停滞的问题
你用echo -e -n "\x11\x22\x33" | nc 127.0.0.1 port发送后停滞,是因为默认情况下nc会保持连接打开,直到主动关闭。只要加个-q 0参数,让nc在发送完数据后立刻退出就行:
echo -e -n "\x11\x22\x33" | nc -q 0 127.0.0.1 <port>
另外你的接收命令nc 127.0.0.1 port | od -tx1 -w30是对的,但可以加-An去掉每行开头的冗余地址,让输出更清爽:
nc 127.0.0.1 <port> | od -tx1 -An -w30
更优雅的双向交互:用socat实现实时十六进制收发
socat是Unix下的瑞士军刀,完美适合这种双向二进制转十六进制的场景。一行命令就能搞定:
socat TCP:127.0.0.1:<port> EXEC:'bash -c "xxd -p -r | cat >&3; cat <&3 | xxd -p -c30"',fdin=3,fdout=3
这个命令的作用:
- 左边连接到ucsim的TCP端口
- 右边的bash命令分两部分:
xxd -p -r:把你输入的十六进制字符串(比如112233)转成二进制发送给服务器cat <&3 | xxd -p -c30:把服务器发来的二进制数据转成30列的十六进制显示
- 你直接在终端输入十六进制(不用加
\x前缀),回车就发送;服务器的响应会自动以30列十六进制输出。
自定义短脚本(50行以内)
如果想要更可控的交互(比如输入exit退出),可以用这个bash脚本,逻辑清晰还容易修改:
#!/bin/bash PORT=$1 if [ -z "$PORT" ]; then echo "Usage: $0 <port-number>" exit 1 fi # 临时文件存储服务器接收的数据 RX_TMP="/tmp/ucsim_rx_$$" touch "$RX_TMP" # 启动后台nc接收数据到临时文件 nc 127.0.0.1 "$PORT" > "$RX_TMP" & NC_RX_PID=$! # 启动发送用的nc,绑定到文件描述符3 exec 3> >(nc 127.0.0.1 "$PORT") # 实时把临时文件的内容转成30列十六进制显示 tail -f "$RX_TMP" | xxd -p -c30 & TAIL_PID=$! echo "=== ucsim Hex Console ===" echo "Enter hex codes (type 'exit' to quit):" # 处理用户输入,转成二进制发送 while read -r INPUT; do if [[ "$INPUT" == "exit" ]]; then kill "$NC_RX_PID" "$TAIL_PID" 2>/dev/null rm -f "$RX_TMP" exec 3>&- exit 0 fi # 过滤非十六进制字符(可选,防止输入错误) CLEAN_INPUT=$(echo "$INPUT" | tr -cd '0-9a-fA-F') if [[ -n "$CLEAN_INPUT" ]]; then echo -n "$CLEAN_INPUT" | xxd -p -r >&3 fi done # 清理残留进程和文件 kill "$NC_RX_PID" "$TAIL_PID" 2>/dev/null rm -f "$RX_TMP" exec 3>&-
使用方法:
- 保存为
ucsim_hex_console.sh,加执行权限:chmod +x ucsim_hex_console.sh - 运行:
./ucsim_hex_console.sh <port> - 输入十六进制字符串(比如
1a2b3c)回车发送,输入exit退出。
图形化替代方案(无需Wine)
如果喜欢图形界面,可以试试gtkterm:
- 安装:
sudo apt install gtkterm(Debian/Ubuntu)或sudo dnf install gtkterm(Fedora) - 打开后,点击
Settings > Port,选择Protocol: TCP,输入127.0.0.1和端口号 - 再点击
Settings > Display,勾选Hexadecimal display,还可以调整列数到30
它完全是Linux原生,不会有Wine的锁死问题,操作和RealTerm类似。
内容的提问来源于stack exchange,提问作者Mike -- No longer here
相关产品推荐
相关产品推荐

