hexdumpとxxd形式の違い


9

逆16進ダンプを実行する方法を探していたところ、xxdが言及されていました。ただし、単に次のように機能するようには見えません。

xxd -r hexdumpfile > binaryfile

私は、その後の出力の差分比較xxd infileとをhexdump infile、3の違いを発見しました。

  1. xxd出力では、アドレスの後にコロンが付きます
  2. xxd出力のデータの位置が逆になっている(たとえば、5a42hexdump出力425aではxxd出力になります)
  3. 各行の後にいくつかの余分な文字があります

サーバーにある特定のファイルの16進ダンプバージョンしかありません。どうすればxxdを使用してバイナリデータを正しく取得できますか?


xxdでhexdump形式を使用するオプションを探していましたが、今のところ、いくつかの単純なsed操作でそれを行うことができました
tanon

私は実際にあなたが尋ねるものを正確にテストしていませんが、xxd -pと-bを試してください。バイトオーダーについては、ビッグエンディアンとリトルエンディアンに関係し、xxdはそれを逆転できない可能性がありますが、バイトがファイルに保存される方法に関連しています。 、それをユニコード16ビットビッグエンディアン、リトルエンディアン、UTF-8などとして保存でき、xxdとの違いがわかります。odコマンドでは、表示が異なる場合があります。
barlop

今後の参照のhexdumpために、出力で使用されるエンディアンを選択できるようにします。これにより、これがより簡単になる可能性があります。(なぜ今なのか?無関係なことに役立つ質問が見つかりました。)
jpaugh

回答:


7

変換が実行されることを知っているコマンドはありませんが、いくつかのステップに簡単に分割できます。

  1. hexdumpを使用して出力からアドレスを取り除くsed
  2. 使用してバイナリに変換 xxd
  3. を使用したエンディアン変換(たとえば、に5a42なる425add

完全なコマンドは次のとおりです。

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile


1

この回答はhttps://stackoverflow.com/a/52834021/6770384からのクロスポストです

1つのsedコマンドで変換を行うことができます。これは、追加するのに十分だ:エンディアン(アドレス切替後と変更ab12には12ab)。

sed -E 's/ /: /;s/ (..)(..)/ \2\1/g;$d' dump | xxd -r

既知のバグ(コメントセクションを参照)

  • 元のファイルが奇数長(たとえば、1、3、5、7、...、バイト長)の場合、末尾のnullバイトが追加されます。
  • hexdumpを使用して編集した  場合、元のファイルの繰り返しセクションは正しく復元されません*


@Smeterlinkこの観察をありがとう!そのとおりです。このコマンドは、バイト長が奇数の場合、元のファイルにはなかった後続のnullバイトを生成します。別のバグも発見しました。hexdumpを使用して繰り返しパーツを非表示にする場合があり*ます。このコマンドでは、これらのパーツを正しく復元することもできません。例:100の代わりにyes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -r8のみを印刷しますy。これらのものを修正すると、この1行以上のものが必要になります。多分私は将来別のスクリプトを追加します。
ソコウィ

*ヒントをありがとう、知りませんでした!
Smeterlink
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.