使用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
相关产品推荐
相关产品推荐

