Есть ли такая утилита, как hexdump, которая будет обрабатывать не родной порядок байтов?

3114
EHN

Способность Hexdump читать двоичные данные и форматировать их соответствующим образом, чтобы, например, их можно было передать в awk, очень полезна, но мне нужно регулярно читать файлы, в которых двоичные данные имеют другой порядок байтов, чем тот, который хранится в системе., В частности, мне нужно прочитать данные с прямым порядком байтов на машине с прямым порядком байтов. Мое идеальное решение - это «hexdump» с переключателем для обращения к порядку байтов, но такого переключателя не существует.

Есть ли хорошие "следующие лучшие" решения этой проблемы?

6
Вероятно, это не относится к теме у суперпользователя и вместо этого должно быть на [unix.se], пожалуйста, просмотрите мой ответ, хотя для лучшего метода, чем выбранный. Evan Carroll 6 лет назад 0

5 ответов на вопрос

3
RedGrittyBrick

Есть ли такая утилита, как hexdump, которая будет обрабатывать не родной порядок байтов?

Да, утилита называется Perl.

Ну, на самом деле Data :: HexDumper - хотя вы можете свернуть свой собственный .

number_format Строка, определяющая, как форматировать данные. Это может быть любое из следующего, что вы заметите, имеют те же значения, что и для функции пакета Perl:  C - беззнаковый символ S - 16-разрядный без знака, нативная последовательность v или S <- 16-разрядный без знака, с прямым порядком байтов n или S> - 16-разрядный без знака, с прямым порядком байтов L - беззнаковый 32-битный, нативный порядковый номер V или L <- 32-разрядный без знака, с прямым порядком байтов N или L> - 32-разрядный без знака, с прямым порядком байтов Q - беззнаковая 64-битная, нативная последовательность Q <- беззнаковая 64-битная последовательность байтов Q> - 64-разрядный без знака, с прямым порядком байтов 
Я не очень доволен тем, что полагаюсь на Perl и вынужден выполнять (по общему признанию, очень ограниченную) дополнительную типизацию по сравнению с hexdump, но убедился, что лучших вариантов не существует. EHN 12 лет назад 0
3
Markarian451

По крайней мере, для 16-битных слов можно передать это dd conv=swabкак,

cat file.dat | dd conv=swab | od -t x2 
1
Jonathan Ben-Avraham

Как показывает pixelbeat, вы можете использовать objcopy :

$ objcopy -I binary -O binary --reverse-bytes=num inputfile.bin outputfile.bin 

где num2 для 16-битных слов, 4 для 32-битных слов и 8 для 64-битных слов.

К сожалению, objcopy не имеет возможности принимать входные данные stdinили записывать выходные данные stdout, поэтому для использования его в качестве канала вам нужно написать сценарий-обертку, который создает временные файлы.

Этот ответ скопирован с https://stackoverflow.com/a/19288235/1979048 и с https://serverfault.com/a/329207/157443 .

1
Evan Carroll

Просто используйте od(8,23 или выше). Это часть Стандартной базы Linux, и, на мой взгляд, это лучше, чем hexdumpво всем. Это обеспечивает endianвозможность,

‘--endian=order’ Reorder input bytes, to handle inputs with differing byte orders, or to provide consistent output independent of the endian convention of the current system. Swapping is performed according to the specified --type size and endian order, which can be ‘little’ or ‘big’. 

Вы можете использовать это так,

od --endian big -x 

Патч для добавления этого был принят в 2014 году

od не имеет опции --endian ни в одной из систем, которые я использую (GNU coreutils 8.22 или OS X 10.11.6) EHN 6 лет назад 1
@EHN Это было совершено в 8.23, который был в 2014 году. Обновленный вопрос, чтобы отразить это. Evan Carroll 6 лет назад 1
0
fred

dd conv = swab <file.dat | шестнадцатеричного

Добро пожаловать на сайт. Не могли бы вы дополнить этот ответ объяснением того, что делает эта команда, и некоторыми подробностями? Darren 6 лет назад 3

Похожие вопросы