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

如何让Hexdump或替代工具显示Unicode字符?终端与Python方案

如何在hexdump或替代工具中同时显示十六进制及Unicode字符?

我正在解码网络数据,设置的password为pas$w0rd@1ħ213₹。我希望在hexdump的输出中完整看到该密码字符串,但发现它仅支持ASCII范围字符。

Linux hexdump示例输出

hexdump hexd.hex -C -L                          
00000000  18 03 02 40 00 02 ff ff  70 6f 74 61 74 6f 45 43  |...@....potatoEC|
00000010  4f 44 45 43 4f 44 45 43  4f 44 45 43 4f 44 45 43  |ODECODECODECODEC|
00000020  4f 44 45 43 4f 44 45 43  4f 44 45 00 00 02 00 2f  |ODECODECODE..../|
00000030  01 00 00 05 00 0f 00 01  01 0a 55 73 65 72 2d 41  |..........User-A|
00000040  67 65 6e 74 3a 20 63 75  72 6c 2f 37 2e 38 36 2e  |gent: curl/7.86.|
00000050  30 0d 0a 41 63 63 65 70  74 3a 20 2a 2f 2a 0d 0a  |0..Accept: */*..|
00000060  43 6f 6e 74 65 6e 74 2d  4c 65 6e 67 74 68 3a 20  |Content-Length: |
00000070  34 35 0d 0a 43 6f 6e 74  65 6e 74 2d 54 79 70 65  |45..Content-Type|
00000080  3a 20 61 70 70 6c 69 63  61 74 69 6f 6e 2f 78 2d  |: application/x-|
00000090  77 77 77 2d 66 6f 72 6d  2d 75 72 6c 65 6e 63 6f  |www-form-urlenco|
000000a0  64 65 64 0d 0a 0d 0a 75  73 65 72 6e 61 6d 65 3d  |ded....username=|
000000b0  75 73 65 72 6e 61 6d 65  26 70 61 73 73 77 6f 72  |username&passwor|
000000c0  64 3d 70 61 73 24 77 30  72 64 40 31 c4 a7 32 31  |d=pas$w0rd@1..21|
000000d0  33 e2 82 b9 fc f3 ca d2  0a 49 8b 0a b3 47 04 f8  |3........I...G..|

Python3 hexdump库示例输出

000000A0: 64 65 64 0D 0A 0D 0A 75  73 65 72 6E 61 6D 65 3D  ded....username=
000000B0: 75 73 65 72 6E 61 6D 65  26 70 61 73 73 77 6F 72  username&passwor
000000C0: 64 3D 70 61 73 24 77 30  72 64 40 31 C4 A7 32 31  d=pas$w0rd@1..21
000000D0: 33 E2 82 B9 FC F3 CA D2  0A 49 8B 0A B3 47 04 F8  3........I...G..

sed打印可打印字符输出

❯ sed 's/[^[:print:]]//g' hexd.hex       
@��potatoECODECODECODECODECODECODECODE/
User-Agent: curl/7.86.0
Accept: */*
Content-Length: 45
Content-Type: application/x-www-form-urlencoded

username=username&password=pas$w0rd@1ħ213₹����
I�

我的Locale设置为en_US.UTF-8,以下是可行的解决方法:


命令行工具方案

使用xxd(推荐)

xxd对UTF-8多字节字符支持更好,默认就能正确显示Unicode可读字符。执行命令:

xxd -g 1 -u hexd.hex

输出中ħ(对应十六进制C4 A7)和₹(对应十六进制E2 82 B9)会直接显示为原字符,而非hexdump中的.。

使用hd命令

部分系统的hd是hexdump的兼容实现,支持UTF-8显示,尝试执行:

hd -v hexd.hex

自定义hexdump后处理脚本

如果必须使用hexdump,可以用awk脚本替换字符列中的.为对应的UTF-8字符:

hexdump -C hexd.hex | awk '{
    hex_part = substr($0, 1, 58);
    char_part = substr($0, 60);
    bytes = "";
    for (i=1; i<=NF-1; i++) {
        if (i >= 2 && i <= 17) {
            bytes = bytes sprintf("%c", strtonum("0x" $i));
        }
    }
    decoded = "";
    for (j=1; j<=length(bytes); j++) {
        c = substr(bytes, j, 1);
        if (ord(c) >= 32 && ord(c) != 127) {
            decoded = decoded c;
        } else {
            decoded = decoded ".";
        }
    }
    printf "%s  %s\n", hex_part, decoded;
}'

注:该脚本依赖awk支持ord()函数,部分版本可能需要调整。


Python环境方案

自定义UTF-8 Hexdump脚本

自己实现逻辑,确保正确解码UTF-8字符:

import binascii

def utf8_hexdump(data: bytes, width: int = 16) -> str:
    hex_lines = []
    for offset in range(0, len(data), width):
        chunk = data[offset:offset+width]
        # 生成十六进制列
        hex_str = ' '.join(f'{byte:02X}' for byte in chunk)
        # 对齐宽度
        hex_str = hex_str.ljust(width * 3)
        # 解码UTF-8并处理不可打印字符
        try:
            char_str = chunk.decode('utf-8')
            char_str = ''.join(
                c if 32 <= ord(c) <= 126 else '.' 
                for c in char_str
            )
        except UnicodeDecodeError:
            # 解码失败的字节替换为.
            char_str = ''.join('.' for _ in chunk)
        # 添加偏移量和整行内容
        hex_lines.append(f'{offset:08X}: {hex_str}  {char_str}')
    return '\n'.join(hex_lines)

# 使用示例
if __name__ == '__main__':
    with open('hexd.hex', 'rb') as f:
        file_data = f.read()
    print(utf8_hexdump(file_data))

运行后,字符列会正确显示ħ和₹等Unicode字符。

改进第三方hexdump库

如果使用hexdump库,可以修改其显示逻辑,将字节解码为UTF-8而非仅ASCII。例如,找到库中处理字符显示的部分,替换为UTF-8解码逻辑。


内容的提问来源于stack exchange,提问作者RuMAN S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:40:26