Як створити шістнадцятковий дамп файлу, що містить лише шістнадцяткові символи без пробілів у 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
Цікаво, чи здатний hexdump сам додати новий рядок (тільки) до кінця виходу .. (очевидний додаток ; echoунеможливлює використання як псевдонім bash)
mykhal

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

Кількість ітерацій і кількість байтів за замовчуванням до одиниці, тому 1/1 може бути пропущено, залишившиhexdump -ve '"%.2x"'
Алекс Че

@mykhal, можливо, якщо ви знаєте кількість байтів у вихідному. Скажіть, якщо ви використовуєте hexdump для виведення лише 13 перших байтів:hexdump -n 13 -e '13/1 "%.2x" "\n"'
Алекс Че

24

Здається, це залежить від деталей версії od. У OSX використовуйте це:

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

(Це друк у вигляді шістнадцяткових байтів, без адреси. І пробіли, звісно, ​​видаляються згодом.)


1
Я також додав би -vв цьому контексті, інакше це пропускає повторення *.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

10

Perl однолінійний:

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

Перевірено. Відповідає "xxd -p файл | tr -d '\ n'".
Кертіс Яллоп

1
fyi Щоб змінити процес: perl -e 'local $ /; пакет для друку "H *", <> '<hexascii.txt> файл
Кертіс Яллоп,

"Місцевий $ /" зайвий.
Кертіс Яллоп

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

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

2

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.