Как получить определенный формат с помощью hexdump или xxd?

Мне нужны шестнадцатеричные дампы ряда файлов в определенном формате:

00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00

Однако, используя hexdump или xxd, я могу получить вышеприведенное только с двоеточием после адреса и текстом ASCII справа от него, например:

00000000: 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 
MZ..............

Я получил это с помощью команды

xxd -g 1 -u filename

Любые идеи?


person ICEpower    schedule 08.08.2019    source источник
comment
Any ideas? - да, отнеси на superuser.com, где ему и место, этот вопрос не о программировании.   -  person hanshenrik    schedule 08.08.2019
comment
Или на unix.stackexchange.com. И наиболее вероятным ответом будет чтение man-страницы.   -  person Murphy    schedule 08.08.2019
comment
@Shawn Я получил дополнительный текст в конце при выполнении этой команды, i.imgur.com/qTGfhFj.png   -  person hanshenrik    schedule 08.08.2019
comment
@ICEpower Я немного добавил к своему ответу, в том числе о том, как получить вывод в верхнем регистре, если это необходимо, и как избавиться от этой последней строки, которую od всегда печатает, если она вам не нужна.   -  person Shawn    schedule 08.08.2019


Ответы (2)


od в одну сторону:

После создания файла примера через

perl -e 'print map { chr hex } @ARGV' 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 > foo.bin

получение шестнадцатеричного дампа:

$ od -Ax -t x1 foo.bin
0000000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00
0000010

Ключевым здесь является аргумент -t FORMAT. В формате x используется основание 16, а 1 означает вывод одного байта на блок. -Ax говорит распечатать смещения в базе 16 вместо базы 8 по умолчанию.

Он печатает смещение конца файла как последнюю строку, но это тривиально, чтобы избавиться от него с помощью head -n -1, если это не нужно. Кажется, нет способа заставить его использовать шестнадцатеричные цифры в верхнем регистре, но это также легко исправить, если вы предпочитаете их:

$ od -Ax -t x1 foo.bin | head -n -1 | tr a-f A-F
000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00
person Shawn    schedule 08.08.2019
comment
Идеальный! Мне не нужно конечное смещение, и мне нужны шестнадцатеричные цифры в верхнем регистре, так что спасибо за их добавление! - person ICEpower; 08.08.2019

hexdump может создать этот вывод и предоставляет гораздо больше варианты, как только вы разберетесь с несколько запутанным, но мощным синтаксисом формата.

$ hexdump -v -e '"%08_ax" 16/1 " %02X" "\n"' en.gif 
00000000 47 49 46 38 37 61 10 00 0A 00 A1 03 00 CC 00 00
00000010 44 44 CC FF FF FF FF BB 66 2C 00 00 00 00 10 00
00000020 0A 00 00 02 25 8C 20 61 A8 97 BA 92 8B 10 BA CB
00000030 AA 45 FC 59 01 82 C0 18 96 E3 89 A6 64 79 AC 6C
00000040 E5 74 DA 26 D6 F3 84 67 41 01 00 3B

Подробно о формате:

  • "%08_ax" — смещение в шестнадцатеричном формате, 8 цифр с ведущими нулями.
  • 16/1 " %02X" отображает 16 байтов на итерацию (строку), один байт на блок, каждый блок отформатирован как 2 шестнадцатеричных цифры в верхнем регистре с ведущими нулями и предшествующим пробелом.
  • "\n" заканчивает каждую итерацию (строку) новой строкой.
person Murphy    schedule 08.08.2019