Контекст
Это перепост моего вопроса на StackOverflow, который был задан некорректно, поскольку не имеет отношения к программированию.
Я играю в Bandit на OverTheWire, иуровень тринадцатьтребует распаковки различных сжатых форматов файлов без знания расширения файла. Для этого я сравнивал hexdump с сигнатурами файлов изСайт Гари Кесслера.
Однако я заметил, что шестнадцатеричная подпись отображается наоборот. Например, возьмем этот 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
перевернута по сравнению с тем, что указано на сайте Гэри Кесслера:
1F 8B 08 .‹. GZ, TGZ GZIP archive file
VLT VLC Player Skin file
Вопрос
Почему подпись перевернута? 1F 8B 08
против 8b1f 0808
. Первый обнаруженный файл — это шестнадцатеричный дамп архивного файла, data.txt
, и имеет правильную подпись 1f8b 0808
(найденную с помощью head data.txt
), которая идеально совпадает с подписью. Однако, когда я запускаю, xxd -r data.txt | hexdump
я снова 8b1f 0808
.
Комментарии к моему вопросу на StackOverflow, похоже, указывают на то, что это связано с прямым/обратным порядком байтов, и указали мне на -g1
флаг xxd
, который обозначает группировку.
Это дает правильный результат, но я не понимаю, что такое группировка и как она работает.
решение1
Группировка xxd
относится к числу байтов, которые обрабатываются (и отображаются) как единое целое.
По умолчанию xxd
обрабатывает входные данные как группы по 2 байта / 16 бит (четырехзначное шестнадцатеричное число), хранящиеся в порядке от старшего к младшему.
Это приведет к тому, что каждая группа из двух байтов на входе будет отображаться в обратном порядке (но на самом деле в правильном порядке для системы с обратным порядком байтов).
Т.е. первые два байта из входных данных 18 8B
станут одним 16-битным числом 8B18
, что вы и видите.
При изменении xxd
группировки на «1» с помощью опции -g1
все байты из входных данных будут интерпретироваться как однобайтовые числа (которые, очевидно, не имеют «порядка байтов») и будут отображаться в том порядке, в котором они считываются из входных данных.