xxd与od命令输出差异解惑:Java类文件字节序及tac反转问题
问题解答
1. xxd与od -x输出差异的原因
这是两个工具对二进制数据的解析单位和字节序处理逻辑不同导致的:
xxd默认以单字节为单位输出,完全按照文件中字节的存储顺序打印十六进制值。Java class文件的魔数是0xCAFEBABE,对应四个字节CA、FE、BA、BE,所以xxd直接输出cafe babe。od -x默认以16位(双字节)为解析单位,并且采用小端序展示:会把每个双字节单元的两个字节顺序反转。比如第一个双字节是CA FE,小端序下会显示为FE CA(即feca),第二个双字节BA BE显示为BE BA(即beba),最终输出feca beba。
如果让od按单字节输出,结果就会和xxd一致:
od -t x1 A.class
2. tac反转操作未生效的原因
你使用的tac命令并没有正确实现字节级反转:
tac A.class:tac是按行反转文件,但class文件是二进制文件,不含换行符(\n),整个文件就是一行,反转后内容完全不变,所以xxd和od的输出和原文件一致。tac -r -s 'x\|[^x]':这个命令的分隔符设置逻辑错误,二进制文件包含的字节远不止x和非x,无法正确分割每个字节实现反转。要真正做到字节级反转,应该用rev命令:
此时xxd会输出rev A.class | xxdbeba feca(对应反转后的字节BE、BA、FE、CA)。再用od -x处理这个反转后的内容,会输出babe cafe——因为od仍按双字节小端序解析:BE BA被反转成BA BE(babe),FE CA被反转成CA FE(cafe)。
3. fe是否代表一个字节
是的。十六进制中,两位字符正好对应一个8位字节(取值范围0x00到0xFF)。fe就是单个字节的十六进制表示,对应十进制254,二进制11111110。Java魔数CAFEBABE就是由四个这样的字节组成的。
内容的提问来源于stack exchange,提问作者bukwyrm
相关产品推荐
相关产品推荐

