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

使用hexdump与xxd处理十六进制字符串时出现不一致问题

嘿,这个问题我太熟了!你看到的那些额外c2字节,其实是UTF-8编码在背后搞的小动作。让我给你拆解一下原因和解决办法:

为什么会出现c2字节?

你用的awk命令里,printf("%c", strtonum("0x" $0))在默认的UTF-8环境下,当处理的十六进制值对应ASCII范围外的字符(比如a4对应的是Unicode字符U+00A4)时,会自动把这个字符转换成UTF-8的多字节序列。比如U+00A4的UTF-8编码就是c2a4,这就是xxd输出里多出c2的原因——你看到的不是原始单字节,而是UTF-8编码后的结果。

怎么解决?强制输出原始单字节

要让awk输出你预期的原始单字节(而不是UTF-8编码后的多字节),只需要在调用awk前设置LC_CTYPE=C,强制它使用ASCII/Latin-1编码环境。修改后的命令如下:

echo -n "a42d9dfe8f93515d0d5f608a576044ce4c61e61e" \
| sed 's/\(..\)/\1\n/g' \
| LC_CTYPE=C awk '/^[a-fA-F0-9]{2}$/ { printf("%c",strtonum("0x" $0)); }' \
| xxd

执行这个命令后,xxd的输出就会完全符合你的预期,再也看不到额外的c2字节了:

00000000: a42d 9dfe 8f93 515d 0d5f 608a 5760 44ce ..-.....Q]._.WD.
00000010: 4c61 e61e La...

关于xxd -p的补充

你提到用xxd -p也会有同样问题,原因也是一样的——根源在awk的输出被UTF-8编码了。只要在awk前加上LC_CTYPE=C,xxd -p也会输出正确的原始十六进制序列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:11:23