hexdump -C
を逆にする短い AWK スクリプトを作成しました 元のデータに出力します。次のように使用します:
reverse-hexdump.sh hex.txt > data
'*' リピート マーカーを処理し、バイナリであっても元のデータを生成します。hexdump -C
と reverse-hexdump.sh
データ往復ペアを作成します。ここから入手できます:
- GitHub の逆 hexdump リポジトリ
- reverse-hexdump.sh に移動
file
を復元 hexdump file
の出力のみが与えられた場合
hexdump file
の出力しかない場合 元のファイルを復元したい場合、最初に、hexdump のデフォルト出力は、hexdump を実行したシステムのエンディアンに依存することに注意してください!
ダンプを作成したシステムにアクセスできる場合は、以下のコマンドを使用してエンディアンを確認できます:
[[ "$(printf '\01\03' | hexdump)" == *0103* ]] && echo big || echo little
リトル エンディアンの 16 進ダンプの反転
これは最も一般的なケースです。すべての x86/x64 システムはリトルエンディアンです。 hexdump file
を実行したシステムのエンディアンがわからない場合 、これを試してください。
sed 's/ \(..\)\(..\)/ \2\1/g;$d' dump | xxd -r
sed
部分は hexdump
を変換します の xxd
へのフォーマット の形式、少なくともこれまでのところ xxd -r
ビッグエンディアンの hexdump を逆にする
sed '$d' dump | xxd -r
既知のバグ (コメント セクションを参照)
- 元のファイルの長さが奇数の場合 (例:1、3、5、7、...、バイト長)、末尾の null バイトが追加されます。
- 元のファイルの繰り返しセクションが
hexdump
の場合、正しく復元されません*
を使用して ed .
以下のコマンドを実行して、上記の問題のあるケースのダンプを確認できます:
grep -qE '^\*|^[0-9a-f]*[13579bdf] *$' dump && echo bug || echo ok
最初に 16 進ダンプを作成するためのより良い代替手段
non-posix (したがって移植性が低い) xxd
に加えて od
があります (o 総 d ump) は、posix で指定されているため、すべての UNIX ライクなシステムで利用できるはずです:
od -tx1 -An -v
Hex を出力します 10 進ダンプ、数字を 1 バイトとしてグループ化 (-tx1
)、n o A アドレスプレフィックス (-An
、xxd -p
と同様 ) 繰り返しセクションを *
のように省略せずに (-v
)。 xxd -r -p
を使用して、このようなダンプを元に戻すことができます .
xxd
という同様のツールがあります。 . xxd
を実行した場合 ファイル名だけで、かなり標準的な 16 進ダンプ形式でデータをダンプします:
# xxd bdata
0000000: 0001 0203 0405
......
出力を xxd
に戻すと、 -r
で オプションを追加して新しいファイルにリダイレクトすると、16 進ダンプをバイナリに戻すことができます:
# xxd bdata | xxd -r >bdata2
# cmp bdata bdata2
# xxd bdata2
0000000: 0001 0203 0405