0

メッセージのさまざまなチャンクがさまざまなタイプ(int、boolなど)のデータにマップされ、ビットサイズが異なる(int値はメッセージの12ビットなど)8バイトのメッセージがあります。データムが関係するビットのみを渡したいのですが、もっと良い方法があるかどうかはわかりません。私の現在の考えは、ベクトルバックエンドを使用してビット配列型を作成し、指定された型に含まれる値を取得するためのテンプレート化されたアクセサーを用意することです。これを入力しているときに、考えられるすべてのタイプの大きな結合を各データに渡すことができると思い始めています。

編集:

メッセージにはさまざまな種類のデータが含まれています。たとえば、1つのメッセージには8ビットのintと5つの1ビットのboolが含まれ、別のメッセージには16ビットのTimestamped(自分のクラス)と8ビットのintが含まれます。

4

2 に答える 2

1

メッセージは常に同じ形式/順序ですか?つまり。12bitsInt |8bitsChar|など。もしそうなら、簡単な解決策は、それぞれの特定の値を取得するために適切なビットマスクを設定することです。つまり。最初の12ビット(下位)が整数に対応している場合、次のことができます。

__uint64 Message; // Obviously has data in it.
int IntPortion = Message & 0x00000111;

これにより、メッセージの最初の12ビットが整数型の最初の12ビットにコピーされます。メッセージのチャンクごとに適切なビットマスクを設定して続行します。メッセージの形式が一定でない場合は...まあ、メッセージの例を使って詳しく説明する必要があります。また、Boostライブラリにはいくつかの優れたビット操作クラスがあります。

動的ビットセット

ただし、形式が一定の場合はやり過ぎかもしれません。

于 2009-07-14T21:45:19.960 に答える
0

明示的なメンバーサイズを持つ構造体の使用を検討しましたか?たとえば、フィールドサイズが次のようなメッセージがある場合:

  • 最初のフィールドは12ビットです
  • 2番目のフィールドは20ビットです
  • 3番目のフィールドは4ビットです
  • ..。

次のような構造体を定義できます。

typedef struct {
  unsigned int field_1 : 12;
  unsigned int field_2 : 20;
  unsigned int field_3 : 4;
  /* etc */
} message_t;

単純なchar配列にメッセージがあると仮定して、データを構造体にコピーするか、 :-message_tにキャストします。message_t*

char buffer[8] = /* however it's populated */
message_t* message_ptr = &buffer;
int field1 = message->field_1;
int field2 = message->field_2;
于 2009-07-14T21:52:09.730 に答える