6

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

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

5 ответов5

3

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

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

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

number_format
A string specifying how to format the data. It can be any of the following,
which you will notice have the same meanings as they do to perl's pack function:

C        - unsigned char
S        - unsigned 16-bit, native endianness
v or S<  - unsigned 16-bit, little-endian
n or S>  - unsigned 16-bit, big-endian
L        - unsigned 32-bit, native endianness
V or L<  - unsigned 32-bit, little-endian
N or L>  - unsigned 32-bit, big-endian
Q        - unsigned 64-bit, native endianness
Q<       - unsigned 64-bit, little-endian
Q>       - unsigned 64-bit, big-endian
3

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

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

Просто используйте 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 году

1

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

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

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

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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .