Napsal jsem krátký skript AWK, který obrátí hexdump -C
výstup zpět do původních dat. Použijte takto:
reverse-hexdump.sh hex.txt > data
Zvládá značky opakování '*' a generuje původní data, i když jsou binární.hexdump -C
a reverse-hexdump.sh
vytvořit datový okružní pár. Je k dispozici zde:
- Reverzní hexdump úložiště GitHub
- Přímo na reverse-hexdump.sh
Obnovit file
, daný pouze výstupem hexdump file
Pokud máte pouze výstup hexdump file
a chcete obnovit původní soubor, nejprve si všimněte, že výchozí výstup hexdumpu závisí na endianness systému, na kterém jste hexdump spustili!
Pokud máte přístup k systému, který vytvořil výpis, můžete určit jeho endianitu pomocí níže uvedeného příkazu:
[[ "$(printf '\01\03' | hexdump)" == *0103* ]] && echo big || echo little
Vrácení hexdumpu little-endian
Toto je nejčastější případ. Všechny systémy x86/x64 jsou little-endian. Pokud neznáte endianitu systému, který běžel hexdump file
, zkuste to.
sed 's/ \(..\)\(..\)/ \2\1/g;$d' dump | xxd -r
sed
část převede hexdump
do xxd
's, alespoň tak daleko, že xxd -r
funguje.
Změna hexdumpu big-endian
sed '$d' dump | xxd -r
Známé chyby (viz sekce komentářů)
- Pokud měl původní soubor lichou délku (např. 1, 3, 5, 7, ..., dlouhý bajt), přidá se koncový prázdný bajt.
- Opakující se části původního souboru se neobnoví správně, pokud byly
hexdump
ed pomocí*
.
Můžete zkontrolovat svůj výpis pro výše uvedené problematické případy spuštěním příkazu níže:
grep -qE '^\*|^[0-9a-f]*[13579bdf] *$' dump && echo bug || echo ok
Lepší alternativa k vytváření hexdumpů
Kromě non-posix (a proto není tak přenosný) xxd
existuje od
(o ctal d ump), který by měl být dostupný na všech unixových systémech, jak je specifikováno v posix:
od -tx1 -An -v
Vytiskne hex desítkový výpis, seskupení číslic do jednotlivých bajtů (-tx1
), s n o A předpony adres (-An
, podobně jako xxd -p
) a bez zkrácení opakovaných sekcí jako *
(-v
). Takový výpis můžete vrátit pomocí xxd -r -p
.
Existuje podobný nástroj s názvem xxd
. Pokud spustíte xxd
s pouhým názvem souboru vypíše data v poměrně standardním hexadecimálním formátu:
# xxd bdata
0000000: 0001 0203 0405
......
Nyní, když výstup převedete zpět na xxd
pomocí -r
a přesměrujte jej do nového souboru, můžete převést hexadecimální výpis zpět na binární:
# xxd bdata | xxd -r >bdata2
# cmp bdata bdata2
# xxd bdata2
0000000: 0001 0203 0405