Как легко конвертировать в / из простых машиночитаемых шестнадцатеричных данных
Вкратце.
$ 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 строка шестнадцатеричных цифр.