Обратный hexdump -C


FrBrGeorge аватар

FrBrGeorge - Posted on 16 Июль 2015

Утилита xxd не только выполняет шестнадцатеричный дамп, но и может сделать из дампа снова бинарник (с помощью xxd -r). Привычный формат hexdump -C для обратного преобразования надо слегка поправить.

Утилита xxd используется редактором vim для редактирования файлов в шестнадцатеричном виде. Формат выдачи xxd довольно удобный:

$ date | xxd
0000000: d0a7 d182 20d0 b8d1 8ed0 bb20 3136 2031  .... ...... 16 1
0000010: 363a 3238 3a33 3620 4d53 4b20 3230 3135  6:28:36 MSK 2015
0000020: 0a                                       .

Самое удобное в этом формате — то, что полученный дамп можно превратить обратно в исходный поток байтов с помощью xxd -r:

$ date | xxd | xxd -r
Чт июл 16 16:30:26 MSK 2015

Однако я привык пользоваться не xxd, а hexdump -C. Её формат выдачи слегка другой:

$ date | hexdump -C
00000000  d0 a7 d1 82 20 d0 b8 d1  8e d0 bb 20 31 36 20 31  |.... ...... 16 1|
00000010  36 3a 33 35 3a 32 35 20  4d 53 4b 20 32 30 31 35  |6:35:25 MSK 2015|
00000020  0a                                                |.|
00000021

Чтобы с помощью xxd -r превратить такой текст обратно в бинарник, необходимо (1) поставить двоеточие после адреса; (2) слепить попарно байты; (3) убрать двойной пробел посредине; (4) удалить последнюю строку (в ней hexdump указывает смещение конца файла).

Соответственный sed-сценарий выглядит так (привожу тестовую команду целиком):

date | hexdump -C | sed -r '
s/ /:/
s/([[:xdigit:]]{2}) ([[:xdigit:]]{2})/\1\2/g
s/  / /g
/^[[:xdigit:]]{8}$/d
' | xxd -r
Чт июл 16 16:41:09 MSK 2015
0
Ваша оценка: Ничего

хороший типс :)

у xxd есть хорошая опция -ps. она выводит хексдамп без смещения и ascii представления. и её же можно применять с -r. тоесть мы в выводе hexdump обрезаем всё "лишнее", пробелы можно не убирать.

$ date | hexdump -C | sed -e 's/[^ ]*//;s/|.*//' | xxd -r -ps
Пт авг  7 06:41:06 CEST 2015

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.