Оболочка: Как прочитать байты двоичного файла и вывести его в шестнадцатеричном формате?

39

В оболочке, как я могу прочитать байты имеющегося у меня двоичного файла и распечатать вывод в виде шестнадцатеричных чисел?

Том Брито
источник
stackoverflow.com/questions/2003803/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

45

использование hexdump(1)

$ hexdump -x /usr/bin/hexdump 
0000000    feca    beba    0000    0300    0001    0700    0080    0300
0000010    0000    0010    0000    5080    0000    0c00    0000    0700
0000020    0000    0300    0000    00a0    0000    b06f    0000    0c00
0000030    0000    1200    0000    0a00    0100    0010    0000    107c
0000040    0000    0c00    0000    0000    0000    0000    0000    0000
0000050    0000    0000    0000    0000    0000    0000    0000    0000

...

п.д.о.
источник
6
Также проверьте od. Существует также шестнадцатеричный редактор в стиле vi hexer.
LawrenceC
8
Мне больше нравится вывод "hexdump -C file". xxd также хороший инструмент.
Камбус
показать в формате bash hexahexdump -e '"\\\x" /1 "%02x"' filename
Aquarius Power
Для информации: первый столбец - это шестнадцатеричное смещение байтов, остальная часть строки - это 8 наборов двухбайтовых дисплеев, то есть 16 байтов, поэтому вторая строка начинается со смещения 10, равного 16 в шестнадцатеричном формате. Двухбайтовое представление зависит от порядкового номера системы. Введите man hexdumpдля полной информации.
Мигельморин
27

Другой вариант od :

od -t x1 FILE

или

od -x FILE

od есть много вариантов тонкой настройки.

неизвестный пользователь
источник
9
od -t x1Я полагаю, что большинство людей находят предпочтительный формат.
Алекс
Для линии, которую od -t testя получилod: invalid character 't' in type string 'test'
Том Брито
Он работал с--t
Том Брито
@Tom: Может быть, другой вкус Unix / Linux? Мой шанс:od --version od (GNU coreutils) 7.4
пользователь неизвестен
13

Пока мы находимся odи еще hexdumpдва похожих инструмента:

  • hd (из bsdmainutils)
  • xxd (часть Vim)

Образец вывода:

$ hd /usr/bin/od | head
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 03 00 01 00 00 00  20 8e 04 08 34 00 00 00  |........ ...4...|
00000020  a4 a2 00 00 00 00 00 00  34 00 20 00 08 00 28 00  |........4. ...(.|
00000030  1b 00 1a 00 06 00 00 00  34 00 00 00 34 80 04 08  |........4...4...|
00000040  34 80 04 08 00 01 00 00  00 01 00 00 05 00 00 00  |4...............|
00000050  04 00 00 00 03 00 00 00  34 01 00 00 34 81 04 08  |........4...4...|
00000060  34 81 04 08 13 00 00 00  13 00 00 00 04 00 00 00  |4...............|
00000070  01 00 00 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000080  00 80 04 08 c4 9d 00 00  c4 9d 00 00 05 00 00 00  |................|
00000090  00 10 00 00 01 00 00 00  00 a0 00 00 00 20 05 08  |............. ..|

$ xxd /usr/bin/od | head
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 0300 0100 0000 208e 0408 3400 0000  ........ ...4...
0000020: a4a2 0000 0000 0000 3400 2000 0800 2800  ........4. ...(.
0000030: 1b00 1a00 0600 0000 3400 0000 3480 0408  ........4...4...
0000040: 3480 0408 0001 0000 0001 0000 0500 0000  4...............
0000050: 0400 0000 0300 0000 3401 0000 3481 0408  ........4...4...
0000060: 3481 0408 1300 0000 1300 0000 0400 0000  4...............
0000070: 0100 0000 0100 0000 0000 0000 0080 0408  ................
0000080: 0080 0408 c49d 0000 c49d 0000 0500 0000  ................
0000090: 0010 0000 0100 0000 00a0 0000 0020 0508  ............. ..

Или, если вы хотите прочитать байты по одному и распечатать их в своем собственном формате, попробуйте что-то вроде:

while read -n 1 byte; do
    ord=$(printf "%b" "${byte:-\000}" |
          od -t x1 |
          { read offset hex; echo $hex; })
    echo "$ord"
done </usr/bin/od

Образец вывода:

7f
45
4c
46
01
01
01
00
00
00
Mikel
источник
3
в отличие от других, xxd также может отменить модификацию. При этом возможно изменить двоичный файл с помощью оболочки.
Offirmo
2
Ваш whileцикл не работает для символов обратной косой черты и новой строки (и в bash (в отличие от ksh93) для пустых символов), а также не будет работать должным образом в локалях utf8 для байтов с установленным 8-м битом. Кроме того, вам не нужно "od" там, вы можете использоватьprintf '%02x\n' "'$byte"
Стефан Шазелас
Примечание: здесь offsetэто просто «фиктивная переменная»; это не имеет практического применения. Это просто используется в качестве заполнителя, чтобы добраться до hex. Это то, что иногда отрицательно влияет на читабельность read: переменные появляются неожиданно.
синтаксическая ошибка
Может быть. Но в этом случае область действия $offsetограничена вложенной оболочкой, поэтому я не вижу в этом проблемы.
Микель
5

Мои два цента:

tail -f streamfile | hexdump -C

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

MacGyverQue
источник
протестировано с for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&ним хорошо работает для мониторинга THX :)
Водолей Power
4
mc 

Полуночный командир - другой вариант. Я не знаю, доступно ли это для всех версий Unix. Возможно, вам придется скачать его в первую очередь.
F3 F4для просмотра во внутреннем редакторе / в шестнадцатеричном режиме.

неизвестный пользователь
источник
1

Я использую od с c и x1, когда мне нужно искать текст внутри двоичного файла:

$ echo "Some text..." | od -t c -t x1
0000000   S   o   m   e       t   e   x   t   .   .   .  \n
         53  6f  6d  65  20  74  65  78  74  2e  2e  2e  0a
0000015
Серхио К
источник