6

Как легко конвертировать в / из простых шестнадцатеричных данных машиночитаемых (без / смещений / зрения характера отступов) с xdd или hexdump

Я устал копать некоторые строки специального формата (и обнаруживать, что он внезапно начинает перенос строк после N символов или пропуска строк) или писать Perl-однострочники каждый раз.

Почему это не так просто, как base64/base64 -d?

3 ответа3

11
hexdump -e '"%x"'
xxd -p | tr -d '\n'

Если вам надоело писать это каждый раз, создайте псевдоним.

4

Как легко конвертировать в / из простых машиночитаемых шестнадцатеричных данных

Вкратце.

$ xxd -plain test.txt > test.hex
$ xxd -plain -revert test.hex test2.txt
$ diff test.txt test2.txt
$

Объяснение:

$ xxd -plain test.txt > test.hex

Это записывает шестнадцатеричное кодирование данных из test.txt в новый файл test.hex. Параметр -p или -plain заставляет xxd использовать "обычный" шестнадцатеричный формат без пробелов между парами шестнадцатеричных цифр (то есть без пробелов между байтовыми значениями). Это преобразует "ABC ABC" в "61626320414243". Без -p он преобразует текст в 16-битный ориентированный на слова традиционный формат hexdump, который, возможно, легче читать, но менее компактен и, следовательно, менее пригоден в качестве формата передачи и немного сложнее перевернуть.

$ xxd -plain -revert text.hex test2.txt

Для этого используется опция -r или -revert . Опция -plain используется снова, чтобы указать, что входной шестнадцатеричный файл находится в простом формате.

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

$ diff test.txt test2.txt
$ 

Команда diff ничего не выводит - это означает, что нет разницы между исходным и восстановленным содержимым файла.


Я устал копать какие-то строки специального формата

Используйте псевдоним или объявите функции в вашем .profile для создания мнемоники, чтобы вам не приходилось запоминать или копаться в man-страницах.

или просто помните -plain и -revert .


Завернутый вывод

Да, в выводе есть символы новой строки. Вы хотите избежать этого. Вы можете использовать опцию -c или -cols чтобы указать, как долго вы хотите, чтобы выходные строки пытались избежать переноса строк в выходных данных. -c 0 задает длину по умолчанию, а на странице руководства предполагается, что 256 - это предел, но, похоже, он работает за пределами этого.

$ xxd -plain -cols 9999 test.txt > test.hex
$ wc test.txt test.hex
  121   880  4603 test.txt
    1     1  9207 test.hex

Команда wc wordcount сообщает нам, сколько строк, слов и символов содержится в каждом файле.

Таким образом, 121 строка (880 слов, 4603 байта) текста ASCII была закодирована как 1 строка шестнадцатеричных цифр.

1

Вот версия, использующая утилиту od (часть пакета coreutils ):

od -An < input | tr -dc '[:alnum:]'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .