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
hexdumped 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