如何让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
相关产品推荐
相关产品推荐

