Jak utworzyć zrzut heksadecymalny pliku zawierającego tylko znaki szesnastkowe bez spacji w bash?

188

Jak utworzyć niezmodyfikowany zrzut heksadecymalny pliku binarnego w systemie Linux za pomocą bash? odI hexdumppolecenia obydwa pomieszczenia wstawić do wyrzucenia, a to nie jest idealny.

Czy istnieje sposób, aby po prostu napisać długi ciąg ze wszystkimi znakami szesnastkowymi, minus spacje lub znaki nowej linii na wyjściu?

David Raswik
źródło

Odpowiedzi:

250

xxd -p file

Lub jeśli chcesz wszystko w jednym wierszu:

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

mark4o
źródło
13
fyi Aby odwrócić proces: plik xxd -r -ps hexascii.txt (jest w porządku z nowymi liniami lub bez)
Curtis Yallop
92

Ciągi formatujące mogą sprawić, że zrzut szesnastkowy będzie działał dokładnie tak, jak chcesz (w ogóle nie ma białych znaków, bajt po bajcie):

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

1/1oznacza „każdy format jest stosowany raz i zajmuje jeden bajt” i "%.2x"jest łańcuchem formatu, tak jak w printf. W tym przypadku: 2-znakowa liczba szesnastkowa, zera wiodące, jeśli są krótsze.

Michał Trybus
źródło
7
Potrzebujesz -vznaku lub spowoduje to usunięcie powtarzających się bajtów i zastąpienie ich gwiazdką.
Wstrzymano do odwołania.
2
Zastanawiam się, czy sam hexdump jest w stanie dołączyć nowy wiersz (tylko) na końcu danych wyjściowych .. (oczywisty dodatek nie ; echopozwala na użycie jako aliasu bash)
mykhal
2
Mój pseudonim:alias to_hex="hexdump -ve '1/1 \"%.2x\"' && echo"
devstuff
Liczba iteracji i liczba bajtów domyślnie wynosi jeden, więc 1/1 może zostać pominięta, pozostawiająchexdump -ve '"%.2x"'
Alex Che
@mykhal, to możliwe, jeśli znasz liczbę bajtów w danych wyjściowych. Powiedz, jeśli używasz zrzutu heksadecymalnego, aby wyprowadzać tylko 13 pierwszych bajtów:hexdump -n 13 -e '13/1 "%.2x" "\n"'
Alex Che
24

Wydaje się, że zależy to od szczegółów wersji od. W systemie OSX użyj tego:

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

(To jest drukowane jako bajty szesnastkowe typu, bez adresu. I oczywiście później usuwane białe znaki).

Donal Fellows
źródło
1
Dodałbym również -vw tym kontekście, w przeciwnym razie pominie powtórzenia *.
Ciro Santilli 8 冠状 病 六四 事件 法轮功
10

Perl One-Liner:

perl -e 'local $/; print unpack "H*", <>' file
Alan Haggai Alavi
źródło
Zweryfikowano Pasuje do „pliku xxd -p | tr -d '\ n'”.
Curtis Yallop
1
fyi Aby odwrócić proces: perl -e 'local $ /; pakiet wydruku „H *”, plik <> '<hexascii.txt>
Curtis Yallop
„Lokalny $ /” jest niepotrzebny.
Curtis Yallop
Zaktualizuj do ostatniego komentarza: „local $ /” nie jest potrzebny do „pack”. Do rozpakowania potrzebujesz go, ale możesz też wpisać „undef $ /”. $ / to separator linii (domyślnie NL). undefined przełącza go w tryb slurp. Tak więc <> przywoływany w kontekście łańcucha ciągnie cały plik binarny bez parsowania go w wiersze.
Curtis Yallop
Alternatywna forma: perl -e 'print rozpakuj "H *", dołącz ("", <>)' <plik
Curtis Yallop
2

Inne odpowiedzi są preferowane, ale dla czystego rozwiązania Bash zmodyfikowałem skrypt w odpowiedzi tutaj, aby móc wyświetlać ciągły strumień znaków szesnastkowych reprezentujących zawartość pliku. (Jego normalnym trybem jest emulacja hexdump -C.)

Wstrzymano do odwołania.
źródło