Как вставить смещение в hexdump с xxd?

Есть ли простой способ добавить смещение к шестнадцатеричному дампу, сгенерированному xxd?

т.е. вместо

0000: <data>
0004: <data>
0008: <data>

Я должен получить

Offset+0000: <data>
Offset+0004: <data>
Offset+0008: <data>

4 ответа

Решение

Это то, что я делаю сейчас.. Это работает отлично, но это своего рода неудачный подход для простого добавления смещения:)

xxd file.bin | xxd -r -s 0x2e00000 | xxd -s 0x2e00000 > file.hex

xxd теперь появляется поддержка смещения, используя -o [offset]

например: xxd -o 0x07d20000 file.bin

Моя версия xxd в Gentoo Linux есть, но я копался глубже, чтобы помочь людям в других дистрибутивах:

xxd V1.10 27oct98 by Juergen Weigert - Не используйте версию xxd - Я нашел этот исходный код без поддержки смещения! Итак, я обнаружил, откуда бинарный файл:

app-editors/vim-core-7.4.769 - Очевидно, если у вас установлен современный VIM, вы можете воспользоваться преимуществами дополнительной поддержки смещения; по крайней мере, на Gentoo, но я направляю вас в правильном направлении.

Если вы обнаружите, что ваш дистрибутив по-прежнему поставляется с более старым xxd, вы можете вручную скомпилировать более новый VIM, который поддерживает смещение.

Если вы можете жить с AWK, вот подтверждение концепции:

$ xxd random.bin | gawk --non-decimal-data ' # <-- treat 0x123 like numbers
> {
>     offset = 0x1000                # <-- your offset, may be hex of dec
> 
>     colon = index($0, ":") - 1
>     x = "0x" substr($0, 1, colon)  # <-- add 0x prefix to original offset ...
>     sub(/^[^:]*/, "")              # <-- ... and remove it from line
> 
>     new = x + offset               # <-- possible thanks to --non-decimal-data
>     printf("%0"colon"x", new)      # <-- print updated offset ...
>     print                          # <-- ... and the rest of line
> }'
0001000: ac48 df8c 2dbe a80c cd03 06c9 7c9d fe06  .H..-.......|...
0001010: bd9b 02a1 cf00 a5ae ba0c 8942 0c9e 580d  ...........B..X.
0001020: 6f4b 25a6 6c72 1010 8d5e ffe0 17b5 8f39  oK%.lr...^.....9
0001030: 34a3 6aef b5c9 5be0 ef44 aa41 ae98 44b1  4.j...[..D.A..D.
   ^^^^
   updated offsets (+0x1000)

Могу поспорить, что это будет короче в Perl или Python, но AWK просто чувствует себя более "сценарием":-)

Читая ваш комментарий ниже:

Я хочу, чтобы первый байт двоичного файла присутствовал в смещении. т.е. просто добавить смещение без поиска.

заставляет меня поверить, что единственный способ сделать это - анализ выходных данных и изменение их для добавления желаемого смещения.

В документах я не нашел ничего, что позволило бы сделать это легко, извините.:(

Другие вопросы по тегам