You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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命令分两部分:
    1. xxd -p -r:把你输入的十六进制字符串(比如112233)转成二进制发送给服务器
    2. 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>&-

使用方法:

  1. 保存为ucsim_hex_console.sh,加执行权限:chmod +x ucsim_hex_console.sh
  2. 运行:./ucsim_hex_console.sh <port>
  3. 输入十六进制字符串(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:25:27