різниця у форматі hexdump vs xxd


9

Я шукав, як зробити зворотний hexdump і знайшов згаданий xxd. Однак, схоже, це не працює просто:

xxd -r hexdumpfile > binaryfile

Потім я порівняв різницю між результатами xxd infileта hexdump infileі виявив три відмінності:

  1. Вихід xxd має двокрапку після адреси
  2. xxd вихід має позиції в даних, обернених (наприклад, 5a42у hexdump вихід стає 425axxd виведенням)
  3. Після кожного рядка є кілька зайвих символів

У мене на сервері є лише шестигранна версія певних файлів. Як я можу правильно повернути бінарні дані за допомогою xxd?


Шукав якийсь - то варіант в XXD взяти в форматі шістнадцятирічного, але зараз вдалося це зробити з деякими простими СЕД операцій
Танон

Я не дуже перевіряв саме те, що ви запитуєте, але спробуйте xxd -p і -b, -p є простим -b є двійковим, як і ваш -r. Що стосується порядку байтів, то це стосується великих ендіанів та маленьких ендіан, і, можливо, xxd не може це змінити .. але це пов'язано з тим, як байти зберігаються у файлі. Як, якщо у вас є текстовий файл у блокноті ви можете зберегти його як 16-розрядний великий ендіан, або маленький ендіан, або UTF-8, або що завгодно, і ви бачите відмінність від xxd. Команда od може відображати її інакше.
барлоп

Для подальшої довідки hexdumpдозволяє вибирати витривалість, що використовується у її результатах, що могло б зробити це простішим. (Чому зараз?
Визнали

Відповіді:


7

Немає жодної команди, яка мені відома, що буде робити перетворення, але її можна легко розбити на кілька кроків:

  1. Стрипіть адреси з hexdumpвиводу, використовуючиsed
  2. Перетворити на бінарне використання xxd
  3. Ендіанське перетворення (наприклад, 5a42стає 425a) за допомогоюdd

Ось повна команда:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile

не працює, якщо шестнадцять закінчується 0a
Smeterlink

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відредаговані за допомогою  *.

не працює, якщо шестнадцять закінчується 0a
Smeterlink

@Smeterlink Дякую за це спостереження! Ви маєте рацію: ця команда створює кінцевий нульовий байт, який не був у вихідному файлі, якщо довжина в байтах була непарним числом. Я також знайшов ще одну помилку. hexdumpможе приховати повторні частини за допомогою *. Ця команда також не може відновити ці частини правильно. Приклад: yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rдрукується лише 8 yзамість 100. Для виправлення цих речей знадобиться більше, ніж для цього одного вкладиша. Можливо, я додаю ще один сценарій у майбутньому.
Socowi

дякую за *пораду, не знав!
Smeterlink
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.