为何xxd -r会额外添加空字节?od与xxd反向操作问题
为什么用xxd -r反向od -tx1的输出会多出空字节?
问题描述
我需要在没有hexdump或base64工具的系统上反向od命令的输出,测试时执行:
echo TEST | od -tx1 | xxd -r
单独执行echo TEST | od -tx1得到的输出是:
0000000 54 45 53 54 0a 0000005
但经xxd -r反向后再用od查看,结果多出三个空字节:
0000000 54 45 53 54 0a 00 00 00 0000010
请问xxd -r为何会添加这些空字节?
原因分析
核心问题在于**od和xxd的地址格式不兼容**,再加上xxd -r的特殊处理逻辑:
od默认输出的地址是八进制:你看到的0000005是八进制地址,对应十进制的5,也就是TEST\n这5个字节的结束偏移量。xxd -r默认解析地址为十六进制:当xxd -r处理od输出的第二行0000005时,会把这个字符串当成十六进制的0x5(同样对应十进制5)。
按道理,此时输出的字节流长度已经是5,地址5等于当前长度,xxd -r本应不做操作,但实际多出3个空字节的原因是:xxd -r并非为适配od的输出设计——od的纯地址行仅标记偏移量,没有后续数据,而xxd -r在处理这种无数据的地址行时,会错误地将输出对齐到8字节的边界,所以从十进制5填充到8,就多出了3个空字节。
解决方法
要正确反向od -tx1的输出,需要去掉od输出中的地址信息,让xxd -r只处理纯十六进制数据:
# 方法1:用od的-An参数直接去掉地址输出 echo TEST | od -tx1 -An | xxd -r -p # 方法2:用sed过滤掉纯地址行和每行的地址前缀 echo TEST | od -tx1 | sed '/^[0-7]*$/d; s/^[0-7]* //' | xxd -r -p
这两种方法都会得到正确的原始数据,不会出现多余的空字节。
内容的提问来源于stack exchange,提问作者Bowi
相关产品推荐
相关产品推荐

