質問

バイナリ データの UDP パケットを吐き出す外部デバイスと、このデータ ストリームを読み取って解析し、何か役立つことを行う必要がある組み込みシステム上で実行されるソフトウェアがあります。バイナリ データもファイルに記録されます。UDP ストリームまたはファイルから直接入力を簡単に取得し、データを特定の形式に解析して、出力をファイル (例: ファイル) に送信できるパーサーを作成したいと考えています。matlab dat ファイル)、またはリアルタイム処理を実行する別のプロセスに転送します。この問題を解決するのに役立つリソースはありますか?また、これに対処する最善の方法は何ですか?C++ ストリームを使用することは理にかなっていると思いますが、カスタム出力ストリームの作成には慣れていません。これは良いアプローチだと思われますか、それとももっと良い方法があるでしょうか?

ありがとう。

役に立ちましたか?

解決

バイナリ データの利点は、一般的に非常に固定された形式であることです。これを解析する一般的な方法は、受信したパケットにマップする構造体を宣言し、型キャストを使用してフィールドを構造体要素として読み取ることです。

利点は、これには解析が必要ないことです。

構造マップをまったく同じ方法で作成するには、構造パッキング規則とエンディアンに注意する必要があります。C の「offsetof」マクロと「sizeof」マクロを使用すると、デバッグ情報を出力して、構造体が実際にマッピングしていると考えられるものにマッピングされていることを確認するのに役立ちます。

パッキング ルールは通常、ディレクティブ (#pragma など) またはコマンド ライン オプションによって変更できます。あなたが行き詰まっているエンディアンネス。組み込みシステムが使用しているものと異なる場合は、すべてのフィールドをバイトとして宣言するか、「ntoh」マクロなどを使用してバイト スワップを実行します。

他のヒント

ニュージャージー マシン コード ツールキット 任意のバイナリ パターンをデコードするためのスキームです。元々は命令セットをデコードするために設計されましたが、メッセージ形式をデコードするのにも十分に適しているはずです。バイナリ形式の説明を指定すると、その形式のフィールドにアクセスするコードが合成されます (有効な場合)。したがって、フィールドの場所やエンコード方法を考えることなく、生成された関数呼び出しを使用してメッセージ フィールドを参照できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top