Ho scritto un breve script AWK che inverte hexdump -C
restituire i dati originali. Utilizzare in questo modo:
reverse-hexdump.sh hex.txt > data
Gestisce i marcatori di ripetizione '*' e genera dati originali anche se binari.hexdump -C
e reverse-hexdump.sh
creare una coppia di dati andata e ritorno. È disponibile qui:
- Repo GitHub reverse-hexdump
- Diretto a reverse-hexdump.sh
Ripristina file
, dato solo l'output di hexdump file
Se hai solo l'output di hexdump file
e desideri ripristinare il file originale, per prima cosa nota che l'output predefinito di hexdump dipende dall'endianness del sistema su cui hai eseguito hexdump!
Se hai accesso al sistema che ha creato il dump, puoi determinarne l'endianità usando il seguente comando:
[[ "$(printf '\01\03' | hexdump)" == *0103* ]] && echo big || echo little
Inversione dell'hexdump little-endian
Questo è il caso più comune. Tutti i sistemi x86/x64 sono little-endian. Se non conosci l'endianness del sistema che ha eseguito hexdump file
, prova questo.
sed 's/ \(..\)\(..\)/ \2\1/g;$d' dump | xxd -r
Il sed
parte converte hexdump
in xxd
, almeno fino a quel momento xxd -r
funziona.
Inversione dell'hexdump big-endian
sed '$d' dump | xxd -r
Bug noti (vedi sezione commenti)
- Un byte nullo finale viene aggiunto se il file originale era di lunghezza dispari (ad es. 1, 3, 5, 7, ..., lungo byte).
- Le sezioni ripetute del file originale non vengono ripristinate correttamente se erano
hexdump
ed utilizzando un*
.
Puoi controllare il tuo dump per i casi problematici di cui sopra eseguendo il comando seguente:
grep -qE '^\*|^[0-9a-f]*[13579bdf] *$' dump && echo bug || echo ok
Migliore alternativa per creare dump esadecimali in primo luogo
Oltre al non-posix (e quindi non così portatile) xxd
c'è od
(o ctal d ump) che dovrebbe essere disponibile su tutti i sistemi unix-like come specificato da posix:
od -tx1 -An -v
Stamperà una x esadecimale dump adecimale, raggruppamento di cifre come singoli byte (-tx1
), con n o A prefissi di indirizzo (-An
, simile a xxd -p
) e senza abbreviare le sezioni ripetute come *
(-v
). Puoi invertire tale dump usando xxd -r -p
.
Esiste uno strumento simile chiamato xxd
. Se esegui xxd
con solo un nome di file scarica i dati in un formato di dump esadecimale abbastanza standard:
# xxd bdata
0000000: 0001 0203 0405
......
Ora se reinvii l'output a xxd
con -r
opzione e reindirizzarlo a un nuovo file, puoi riconvertire il dump esadecimale in binario:
# xxd bdata | xxd -r >bdata2
# cmp bdata bdata2
# xxd bdata2
0000000: 0001 0203 0405