Как преобразовать данные файла в обычный шестнадцатеричный формат?

12625
Vi.

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

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

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

5
Потому что это почти никому не нужно. Ignacio Vazquez-Abrams 13 лет назад 0
`base64` * делает * вывод по умолчанию. grawity 13 лет назад 1

3 ответа на вопрос

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

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

Я устал от просмотра страницы руководства и меня смущает необходимость сочинять строки формы hexdump или что-то вроде xxd "postscript". (Этот постскриптум о принтерах или письмах?) Vi. 13 лет назад 1
@Vi, думай о -p как о «простом». Я предполагаю, что комментарий к Postscript объясняется тем, что язык Postscript допускает встроенные данные (обычно изображения), закодированные именно таким образом. Поэтому программисты Postscript могут использовать xxd для преобразования двоичных изображений в удобную форму для встраивания в файл Postscript. RedGrittyBrick 13 лет назад 2
Для шестнадцатеричного вывода в верхнем регистре с `xxd` используйте` -u`. Peter Mortensen 6 лет назад 0
4
RedGrittyBrick

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

Вкратце.

$ 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. Опция -por -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задает длину по умолчанию, а man-страница предполагает, что 256 - это предел, но, похоже, он работает за пределами этого.

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

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

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

(пропускал опцию "-p" во время чтения man из-за таинственной вещи "postscript") Vi. 13 лет назад 0
Завернутый вывод. Vi. 13 лет назад 0
@Vi: я понимаю. Из любопытства, в чем проблема с упакованным выводом (т. Е. С небольшим процентом, возможно, излишних LF-символов)? RedGrittyBrick 13 лет назад 1
Это может быть проблемой, если включить шестнадцатеричный код в конфигурационные файлы, например, INIT = 01303031313102 CMD1 = 41414141FF000000. Vi. 13 лет назад 0
Можете ли вы немного рассказать о том, что делают 3 командные строки (редактируя ответ)? Peter Mortensen 6 лет назад 0
@Питер. Я сделал это RedGrittyBrick 6 лет назад 0
1
kenorb

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

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

Похожие вопросы