Более широкий шестнадцатеричный вывод - PullRequest
1 голос
/ 29 октября 2019

Я большой поклонник форматирования по умолчанию команды hd. Например:

$ head -c128 /bin/bash |hd
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  03 00 3e 00 01 00 00 00  30 f6 02 00 00 00 00 00  |..>.....0.......|
00000020  40 00 00 00 00 00 00 00  48 ce 11 00 00 00 00 00  |@.......H.......|
00000030  00 00 00 00 40 00 38 00  0b 00 40 00 1d 00 1c 00  |....@.8...@.....|
00000040  06 00 00 00 04 00 00 00  40 00 00 00 00 00 00 00  |........@.......|
00000050  40 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00  |@.......@.......|
00000060  68 02 00 00 00 00 00 00  68 02 00 00 00 00 00 00  |h.......h.......|
00000070  08 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00  |................|
00000080

Я ищу команду hexdump, которая делает то же самое, но имеет двойную ширину. Вывод должен выглядеть примерно так:

$ head -c128 /bin/bash |2hd
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  03 00 3e 00 01 00 00 00  30 f6 02 00 00 00 00 00  |.ELF............| |..>.....0.......|
00000020  40 00 00 00 00 00 00 00  48 ce 11 00 00 00 00 00  00 00 00 00 40 00 38 00  0b 00 40 00 1d 00 1c 00  |@.......H.......| |....@.8...@.....|
00000040  06 00 00 00 04 00 00 00  40 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00  |........@.......| |@.......@.......|
00000060  68 02 00 00 00 00 00 00  68 02 00 00 00 00 00 00  08 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00  |h.......h.......| |................|
00000080

Пока у меня есть это. Это не выстраивается должным образом.

2hd() {
  local poe='"  " 8/1 "%02x "'  # pieces of eight, heh
  hexdump -e '"%07.7_Ax\n"' \
          -e '"%07.7_ax" '"$poe $poe $poe $poe"' "  |" 32/1 "%_p" "|\n"' "$@"
}
$ head -c128 /bin/bash |2hd
0000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  03 00 3e 00 01 00 00 00  30 f6 02 00 00 00 00 00  |@.......H...........@.8...@.....|
0000040  06 00 00 00 04 00 00 00  40 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00  |h.......h.......................|
0000080  a8 02 00 00 00 00 00 00  a8 02 00 00 00 00 00 00  a8 02 00 00 00 00 00 00  1c 00 00 00 00 00 00 00  |................................|
00000c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  98 cd 02 00 00 00 00 00  98 cd 02 00 00 00 00 00  |................................|
0000100

(Я не решил, хочу ли я, чтобы правый дисплей был в одной части или двух.)

Я надеюсь сделать это полностью в рамках одной ссылки на hexdump. Было бы полезно узнать, как будет выглядеть команда hexdump для получения 16-столбного hd вывода. (Документы, которые я могу найти, здесь не помогают.)

1 Ответ

2 голосов
/ 29 октября 2019

Я думаю, вам, возможно, просто нужно разделить вторую -e:

2hd() {
  local poe='"  " 8/1 "%02x "'
  hexdump -e '"%07.7_Ax\n"' \
          -e '"%07.7_ax" '"$poe $poe $poe $poe" \
          -e ' "  |" 32/1 "%_p" "|\n"' "$@"
}

Несколько -e каждая работает на одном входе. В вашем оригинале %_p применяется к входу после %x, потому что он находится в том же -e.


hexbox-источнике busybox определяет -C как:

bb_dump_add(dumper, "\"%08.8_Ax\n\""); // final address line after dump
//------------------- "address  "   8 * "xx "    "  "  8 * "xx "
bb_dump_add(dumper, "\"%08.8_ax  \"8/1 \"%02x \"\"  \"8/1 \"%02x \"");
//------------------- "  |ASCII...........|\n"
bb_dump_add(dumper, "\"  |\"16/1 \"%_p\"\"|\n\"");

, что означает, что вы можете реализовать hd как:

hexdump -e "\"%08.8_Ax\n\"" -e "\"%08.8_ax  \"8/1 \"%02x \"\"  \"8/1 \"%02x \"" \
        -e "\"  |\"16/1 \"%_p\"\"|\n\""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...