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?


Odpowiedzi:


250

xxd -p file

Lub jeśli chcesz wszystko w jednym wierszu:

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


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.


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).


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

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.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.