Контекст

Контекст

Контекст

Это перепост моего вопроса на 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все байты из входных данных будут интерпретироваться как однобайтовые числа (которые, очевидно, не имеют «порядка байтов») и будут отображаться в том порядке, в котором они считываются из входных данных.

Связанный контент