16進ダンプを人間が読める形式に変換するための汎用ユーティリティまたはライブラリはありますか?
-
08-07-2019 - |
質問
私はさまざまなデバイスとのシリアル通信で多くの仕事をしているので、ログファイルの16進ダンプを分析することがよくあります。現在、私はダンプを見て、プロトコルの仕様を見て、結果を書き留めることでこれを手動で行います。ただし、これは面倒でエラーが発生しやすく、特に大量のメッセージにはビッグエンディアンとリトルエンディアンのデータ、ASCII、Unicode、圧縮、CRCなどが混在しているなどの大きな問題があります。 。 。 。
より一般的なケースを支援するために、いくつかのPythonスクリプトを作成しました。しかし、対処するプロトコルはたくさんあります。分析するダンプがたくさんあるとわからない限り、カスタムスクリプトの作成に時間を費やすことは意味がありません。
私が望んでいるのは、このアクティビティを自動化できるユーティリティです。したがって、たとえば、次のようなテキストの16進ダンプがある場合:
7e ff 00 7b 00 13 86 04
00 41 42 43 44 56 ef 7e
およびメッセージ形式の説明、次のようなもの:
# Field Size Byte Order Output Format
Flag 1 hex
Address 1 hex
Control 1 hex
DataType 1 decimal
LineIndex 1 decimal
PollAddress 2 msb hex
DataSize 2 lsb decimal
Data (DataSize) ascii
CRC 2 lsb hex
Flag 1 hex
次のような出力が得られます:
Flag 0x7e
Address 0xff
Control 0x00
DataType 123
LineIndex 0
PollAddress 0x1386
DataSize 4
Data "ABCD"
CRC 0xef56
Flag 0x7e
ハードウェアベースのプロトコルアナライザーは、この種のことを行うための洗練された機能を備えていることがよくありますが、テキストログファイルを操作する必要があります。
そのようなユーティリティまたはライブラリは存在しますか?
賞金を設定してから、良い答えがいくつか出てきました。賞金が効くと思います!
WiresharkとHexEditは両方とも有望に見えます。私はそれらを見て、おそらく私のニーズに合ったものに賞金を授与します。しかし、私はまだ他のアイデアを受け入れています。
解決
Wireshark は、ネットワークプロトコルを開くのに非常に優れています。
他のヒント
優れた16進エディタが必要だと思います。 hexedit をご覧ください。私は過去に無料版を使用しましたが、それは良いですが、あなたが探しているものを提供するかどうかはわかりません。基本的に、構造体を定義してから、それに対して16進データをデコードできるようにする必要があります。優れた16進エディターがこれをサポートすると思います。別のエディターについては、HexEditまたはgoogleの有料版を確認してください。多数あります。
通常、emacs hexl-modeを使用して、バイナリファイルを「テキストダンプ」として表示します。より具体的な出力が必要な場合は、あなたと同じようにC ++でパーサーを作成します。
私の仕事では、組み込みハードウェアを制御するネットワークおよびシリアルプロトコルを設計していました。間違ったダンプを読んだり、各プロトコルのスクリプトを書いたりするのにもうんざりしていたので、私はあなたが説明したことを正確に行うためのライブラリを書きました。プロトコルのテキストファイルの説明を指定できます。また、単一ビットを設定するためのチェックボックス、有効なビットの組み合わせを選択するためのラジオボタン、および多くの選択肢がある場合のドロップダウンリストをサポートするGUIがありました。データの16進表示、各フィールドのバイナリ表示、またはフィールドをポイントアンドクリックすれば、他のすべての表示が更新されます。それは私たちに多くの時間を節約しました。それは少し速くて汚いですが、雇用主が所有していない場合は投稿します。ポイントは、書くのはそれほど難しくなかったということです。そして、各プロトコルのスクリプトから離れ、プロトコルの説明を理解できる1つのプログラムに移ると、物事は素晴らしかったです。ダンプの誤読に関連する混乱を止め、新しいプロトコルの追加は簡単になりました。さらに、プロトコルのテキストによる説明が開発仕様に直接組み込まれたため、ソフトウェア担当者はハードウェアをどう処理するかを理解できます。ぜひ試してみることをお勧めします。
Tclバイナリコマンドを使用してください。このような。以下は、上記の例の開始点です。 Tclは、スクリプトを簡単に習得して記述できます。シリアルコミュニケーションを行う場合は、少なくとも基本を習得する必要があります。
bash$ tclsh
% binary scan [binary format H* 7eff007b00138604004142434456ef7e] \
H2H2H2ccH4sa4h4H2 \
flag1 addr ctl datatype lineidx polladdr datasize data crc flag2
10
% puts "$flag1 $addr $ctl $datatype $lineidx \
$polladdr $datasize $data $crc $flag2"
7e ff 00 123 0 1386 4 ABCD 65fe 7e
バイト順の処理を行ったとき、バイトではなくバイトを切り替えたので、何を探していたのかよくわかりません。とにかく、これで開始できます。
16進ダンプを分析するために何年も使用しています。 C / C ++スタイルでデータ構造を定義し、その形式でデータを表示できる構造ビューアがあります。
WinHex は、ユーザー定義のレコード形式の表示/編集をサポートしています。 http://www.x-ways.net/winhex/templates/index.html
私は、CPANでそのようなものを見たと確信しています。あなたが好きなら、私はもっと曖昧になります:-)
更新:希望どおりではありませんが、 Parse :: Binary :: FixedFormat
フォーマット文字列(外部ファイルにある可能性がある)を使用してこれを行う hexdump
というBSDコマンドラインユーティリティがあります。 https://www.suse.com/communities/blog/making-をご覧ください。はじめにセンス-hexdump / 、例えば https://www.freebsd.org/cgi/man.cgi?マニュアルページのquery = hexdump& sektion = 1 ( -e
および -f
オプションと Formats )。