语境
这是我在 StackOverflow 上提出的一个错误问题的转发,因为它与编程无关。
我在 OverTheWire 上玩 Bandit,十三级需要在不知道文件扩展名的情况下解压各种压缩文件格式。为此,我一直在将十六进制转储与以下文件签名进行比较:加里凯斯勒的网站。
然而,我注意到十六进制签名是倒着出现的。例如,以这个gz, tgz gzip
存档文件为例:
0000000 8b1f 0808 5006 5eb4 0302 6164 6174 2e32
0000010 6962 006e 3d01 c202 42fd 685a 3139 5941
0000020 5326 8e59 1c4f 00c8 1e00 ff7f f9fb da7f
...
8b1f 0808
与 Gary Kessler 的网站所示相比,签名是反的:
1F 8B 08 .‹. GZ, TGZ GZIP archive file
VLT VLC Player Skin file
问题
为什么签名是反的?1F 8B 08
vs 8b1f 0808
。遇到的第一个文件是存档文件的十六进制转储,data.txt
并且具有正确的签名1f8b 0808
(使用 找到head data.txt
),与签名完全一致。但是,当我xxd -r data.txt | hexdump
再次运行 I时8b1f 0808
。
我的 StackOverflow 问题上的评论似乎表明它与大/小端有关,并向我指出了代表分组-g1
的标志。xxd
这确实提供了正确的输出,但我不明白分组是什么或它是如何工作的。
答案1
分组是xxd
指作为一个单位处理(和显示)的字节数。
默认情况下,xxd
将其输入视为以大端顺序存储的 2 字节/16 位(四位十六进制数)组。
这将导致输入的每一组两个字节以相反的顺序显示(但实际上是大端系统的正确顺序)。
即输入的前两个字节18 8B
将变成一个 16 位数字8B18
,这正是您所看到的。
当您xxd
使用选项将分组更改为“1”-g1
时,来自输入的所有字节都将被解释为单字节数字(显然没有“字节顺序”),并将按照从输入中读取的顺序显示。