質問

私の送受信バイナリデータのデバイスをパケット(64バイト)が標準です。のデータは、特定のフォーマット、部品の異なる異なる要求に応じます。

今は設計通訳、受信したデータです。を読み込むだけなので、データによる位置でもOKですが、どんなにとった時には、十数に反映される場合とそうでないます。私の考えを複数構造体にその目的がわからないのでとパディングします。

ん、ありがとうございまのより良いそうです。


関連:

役に立ちましたか?

解決

もちろん、この無数の前に:でも普通のシナリオに対するあなたのほぼない。

いような気が約で最も効率的なも可能です。

ただし、次の場風間に多くの時間梱包-開梱のパケットし、そこには常に変更できます。なんせんた場合なったといっていないネットワークルーター!

な構造体を用い/労働組合が最も効率的なアプローチのランタイムで数多くの合併症:納得のコンパイラをパックに構造体/労働組合に合わせてオクテットのパケットに必要な作業を避けるアライメントとendianness問題、不安がありませんのでや機会の少ないアメニティチェックのデバッグ構造を作成する環境が整いました

私はよく風と建築を含むでは、以下のようなもの:

  • パケット基底クラスです。ある普通のデータの分野でアクセス可能な変更可能).データが得られない場合にはいさ満載の形式は、その仮想関数を演出が満載です。
  • 多数の発表授業のための特定のパケットの種類に由来する共通のパケットタイプです。いいパッキング機能、そしてそれぞれの発表のクラスが実装しなければならないのです。
  • 何れからも推し量ることができる特定の型のクラス(つまりパケットタイプidからデータフィールド)対応の一環としてトの再計算ではその他変更できません。
  • それぞれの発表のクラスを構築することができから開梱のパケットは優雅に失敗する場合、パケットデータが無効のためのパターンを示すことが分かった。このきまりに包まれた工場です。
  • しなければいRTTIをご用意し、できる"貧しい人のRTTIを利用する"パケットのidを決定する特定の発表のクラスオブジェクトのプラットフォームに対応

これらすべてにおいて、できるだけのためのデバッグ-ビルドを確認するためにそれぞれの分野により変更可能ですが設定されている、sane値です。なかのように聞こえるかもしれないので非常に難しくしていinvalidly形式のパケットに、事前にパケットすることができますeasilly確認眼用のデバッガからのすべての通常のプラットフォームがネイティブのフォーマット変数).

いためにはより効率的な保存スキームとも可能に包まれたこの抽象化の少ない追加のコストパフォーマンス.

他のヒント

利用に必要な構造体およびまたは組合であったことである。する必要がありまだデータが適切に梱包の両側に接続しい翻訳からネットワークバイト順の使い方はそのままに、両方のチャンスがあったの両側に接続できる走り異なるendianess.

一例として:

#pragma pack(push)  /* push current alignment to stack */
#pragma pack(1)     /* set alignment to 1 byte boundary */
typedef struct {
    unsigned int    packetID;  // identifies packet in one direction
    unsigned int    data_length;
    char            receipt_flag;  // indicates to ack packet or keep sending packet till acked
    char            data[]; // this is typically ascii string data w/ \n terminated fields but could also be binary
} tPacketBuffer ;
#pragma pack(pop)   /* restore original alignment from stack */

合格:

packetBuffer.packetID = htonl(123456);

を受ける場合:

packetBuffer.packetID = ntohl(packetBuffer.packetID);

この議論の Endiannessアライメントと構造と梱包

かない場合にはパックの構造で終わるのを揃える単語の境界内部のレイアウトの構造とそのサイズは正しくありません。

これは、最善の解決策は、データの正確な形式(複数可)を知らなくては何か言うのは難しいです。あなたは労働組合を使用して考えられていますか?

私はWuggyに同意します。あなたもこれを行うには、コード生成を使用することができます。それぞれのプロトタイプ構造とserialiation /アンシリアライズ機能を生成するために、その上にPythonスクリプトを実行し、すべてのパケットタイプを定義するには、単純なデータ定義ファイルを使用してください。

これは、「アウト・オブ・ボックス」ソリューションですが、私は、Python <のhref =「http://construct.wikispaces.com/」のrel = "nofollowをnoreferrerを見てみることをお勧めしたいです「> のライブラリーを構築します。

  

コンストラクトは用のPythonライブラリです   データの解析と建物   構造(バイナリまたはテキスト)。それはあります   定義するデータの概念に基づいて   宣言方式で構造、   むしろ、手続き型コードより:もっと   複雑な構築物が構成されています   単純なものの階層。それはです   解析楽しくなる最初のライブラリ、   代わりに、それはいつもの頭痛の   今日ます。

コンストラクトは、非常に堅牢で強力です、とだけチュートリアルを読んですることで、よりよく問題を理解するのに役立ちます。著者はまた、定義から自動生成Cコードのための計画を持っているので、それは間違いなく価値について読むための努力です。

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