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

188

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

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

Дэвид Расвик
источник

Ответы:

250

xxd -p file

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

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

mark4o
источник
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 '

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

Donal Fellows
источник
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.)

Приостановлено до дальнейшего уведомления.
источник