语境

语境

语境

这是我在 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 08vs 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时,来自输入的所有字节都将被解释为单字节数字(显然没有“字节顺序”),并将按照从输入中读取的顺序显示。

相关内容