Разница в формате hexdump и xxd

9

Я искал, как сделать обратную hexdump и нашел упомянутый xxd. Тем не менее, это не похоже на работу с:

xxd -r hexdumpfile > binaryfile

Затем я сравнил разницу между выходами xxd infileи hexdump infileи обнаружил три различия:

  1. Выход xxd имеет двоеточие после адреса
  2. Вывод xxd имеет позиции в обращенных данных (например, 5a42при выводе hexdump становится 425aвыводом xxd)
  3. Есть несколько дополнительных символов после каждой строки

У меня есть только шестнадцатеричная версия определенных файлов на сервере. Как я могу правильно вернуть двоичные данные, используя xxd?

Танон
источник
Искал какой-нибудь вариант в xxd для использования в формате hexdump, но сейчас ему удалось сделать это с помощью нескольких простых операций sed
tanon
Я на самом деле не проверял, что именно вы спрашиваете, но попробуйте xxd -p и -b, -p это просто -b, это двоичный файл, а также ваш -r. Что касается порядка следования байтов, то это относится к порядку с прямым и обратным порядком байтов, и, возможно, xxd не может изменить это… но это связано с тем, как байты хранятся в файле. Как, если у вас есть текстовый файл в блокноте Вы можете сохранить его как Unicode 16-битный с прямым порядком байтов, или с прямым порядком байтов или UTF-8, или как угодно, и вы увидите отличие от xxd Команда od может отображать это по-другому.
Барлоп
Для дальнейшего использования hexdumpпозволяет выбрать порядок байтов, используемый в его выводе, что может упростить это. (Почему сейчас? Ваш вопрос
оказался

Ответы:

7

Я не знаю ни одной команды, которая бы выполняла преобразование, но ее легко разбить на несколько шагов:

  1. Убрать адреса из hexdumpвывода используяsed
  2. Преобразовать в двоичный файл, используя xxd
  3. Endian-преобразование (например, 5a42становится 425a) с использованиемdd

Вот полная команда:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile
Тим
источник
не работает, если hexdump заканчивается
0a
1

Этот ответ является кросс-пост от https://stackoverflow.com/a/52834021/6770384

Вы можете сделать преобразование в одной sedкоманде. Достаточно добавить :после адреса и изменить порядковый номер (переключение ab12на 12ab).

sed -E 's/ /: /;s/ (..)(..)/ \2\1/g;$d' dump | xxd -r

Известные ошибки (см. Раздел комментариев)

  • Завершающий нулевой байт добавляется, если исходный файл имел нечетную длину (например, 1, 3, 5, 7, ..., длина байта).
  • Повторяющиеся разделы исходного файла не восстанавливаются правильно, если они были hexdumpотредактированы с использованием  *.
Socowi
источник
не работает, если hexdump заканчивается
0a
@Smeterlink Спасибо за это наблюдение! Вы правы: эта команда создает завершающий нулевой байт, которого не было в исходном файле, если длина в байтах была нечетным числом. Я также нашел еще одну ошибку. hexdumpможет скрыть повторяющиеся части, используя *. Эта команда также не может правильно восстановить эти части. Пример: yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rпечатает только 8 yвместо 100. Исправление этих вещей потребовало бы больше, чем эта однострочная. Возможно, я добавлю еще один скрипт в будущем.
Socowi
спасибо за *совет, не знал!
Smeterlink