Come creare un dump esadecimale di file contenente solo i caratteri esadecimali senza spazi in bash?


188

Come faccio a creare un dump esadecimale non modificato di un file binario in Linux usando bash? I comandi ode hexdumpinseriscono entrambi spazi nel dump e questo non è l'ideale.

C'è un modo per scrivere semplicemente una lunga stringa con tutti i caratteri esadecimali, meno gli spazi o le nuove righe nell'output?


Risposte:


250

xxd -p file

O se vuoi tutto su una sola riga:

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


13
fyi Per invertire il processo: xxd -r -ps hexascii.txt file (va bene con o senza newline)
Curtis Yallop,

92

Le stringhe di formato possono far sì che hexdump si comporti esattamente come si desidera (nessuno spazio, byte per byte):

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

1/1significa "ogni formato viene applicato una volta e richiede un byte", ed "%.2x"è la stringa di formato effettiva, come in printf. In questo caso: numero esadecimale di 2 caratteri, zeri iniziali se più brevi.


7
È necessario un -vo eliminerà i byte ripetuti e li sostituirà con un asterisco.
In pausa fino a nuovo avviso.

2
Mi chiedo se hexdump stesso sia in grado di aggiungere la nuova riga (solo) alla fine dell'output .. (l'ovvia appendice ; echorende impossibile l'uso come alias bash)
mykhal

2
Il mio pseudonimo:alias to_hex="hexdump -ve '1/1 \"%.2x\"' && echo"
Devstuff,

Il conteggio delle iterazioni e il conteggio dei byte sono predefiniti su uno, quindi 1/1 può essere omesso, lasciando ilhexdump -ve '"%.2x"'
Alex Che

@mykhal, è possibile, se si conosce il numero di byte nell'output. Di 'se usi hexdump per generare solo 13 primi byte:hexdump -n 13 -e '13/1 "%.2x" "\n"'
Alex Che il

24

Sembra dipendere dai dettagli della versione di od. Su OSX, usa questo:

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

(Questo è il tipo di byte esadecimali di tipo, senza indirizzo. E gli spazi bianchi eliminati in seguito, ovviamente.)


1
Vorrei anche aggiungere -vin questo contesto, altrimenti salta ripetizioni con *.
Ciro Santilli 8 冠状 病 六四 事件 法轮功

10

Perl one-liner:

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

Verificato. Corrisponde a "xxd -p file | tr -d '\ n'".
Curtis Yallop,

1
fyi Per invertire il processo: perl -e 'local $ /; pacchetto di stampa "H *", <> 'file <hexascii.txt>
Curtis Yallop,

"Local $ /" non è necessario.
Curtis Yallop,

Aggiornamento all'ultimo commento: "local $ /" non è necessario per "pack". Per decomprimere, è necessario ma in alternativa è possibile inserire "undef $ /". $ / è il separatore di riga (NL predefinito). undefined lo mette in modalità slurp. Quindi <> referenziato in un contesto di stringa estrae l'intero file binario senza analizzarlo in righe.
Curtis Yallop,

Modulo alternativo: perl -e 'print decomprime "H *", join ("", <>)' <file
Curtis Yallop

2

Le altre risposte sono preferibili, ma per una soluzione Bash pura, ho modificato lo script nella mia risposta qui per essere in grado di generare un flusso continuo di caratteri esadecimali che rappresentano il contenuto di un file. (La sua modalità normale è di emulare hexdump -C.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.