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


188

Как мне создать неизмененный шестнадцатеричный дамп двоичного файла в Linux с помощью bash? odИ hexdumpкоманды как вставлять пробелы в отвал , и это не является идеальным.

Есть ли способ просто написать длинную строку со всеми шестнадцатеричными символами, минусами или символами новой строки в выводе?


Ответы:


250

xxd -p file

Или, если вы хотите все это в одной строке:

xxd -p file | tr -d '\n'


13
fyi Чтобы полностью изменить процесс: xxd -r -ps hexascii.txt файл (все в порядке с переводом строки или без него)
Кертис Яллоп

92

Строки форматирования могут заставить hexdump вести себя точно так, как вы хотите (без пробелов вообще, побайтно):

hexdump -ve '1/1 "%.2x"'

1/1означает «каждый формат применяется один раз и занимает один байт» и "%.2x"является фактической строкой формата, как в printf. В этом случае: двухзначное шестнадцатеричное число, ведущие нули, если короче.


7
Вам нужен -vили он отбросит повторные байты и заменит их звездочкой.
Приостановлено до дальнейшего уведомления.

2
Интересно, умеет ли сам ; echo
hexdump добавлять символ

2
Мой псевдоним:alias to_hex="hexdump -ve '1/1 \"%.2x\"' && echo"
Devstuff

Число итераций и количество байтов по умолчанию равны единице, поэтому 1/1 можно пропустить, оставивhexdump -ve '"%.2x"'
Alex Che

@mykhal, это возможно, если вы знаете количество байтов в выводе. Скажем, если вы используете hexdump для вывода только 13 первых байтов:hexdump -n 13 -e '13/1 "%.2x" "\n"'
Alex Che

24

Кажется, это зависит от деталей версии od. На OSX используйте это:

od -t x1 -An file |tr -d '\n '

(Это печатается как шестнадцатеричные байты типа, без адреса. И пробелы, впоследствии, конечно, удаляются.)


1
Я также добавил бы -vв этом контексте, иначе это пропускает повторения с *.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

10

Perl однострочный:

perl -e 'local $/; print unpack "H*", <>' file

Проверенные. Соответствует "xxd -p file | tr -d '\ n'".
Кертис Яллоп

1
fyi Чтобы отменить процесс: perl -e 'local $ /; файл печати "H *", <> '<hexascii.txt> file
Кертис Яллоп

«Местные $ /» не нужны.
Кертис Яллоп

Обновление до последнего комментария: "local $ /" не нужен для "pack". Для распаковки вам это нужно, но вы можете поставить "undef $ /". $ / - разделитель строк (по умолчанию NL). undefined переводит его в режим slurp. Таким образом, <> ссылка в строковом контексте извлекает весь двоичный файл без разбора его на строки.
Кертис Яллоп

Альтернативная форма: perl -e 'print распаковать "H *", join ("", <>)' <file
Curtis Yallop

2

Другие ответы предпочтительнее, но для чистого решения Bash я изменил скрипт в своем ответе здесь, чтобы иметь возможность выводить непрерывный поток шестнадцатеричных символов, представляющих содержимое файла. (Его нормальный режим - подражать hexdump -C.)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.