5

C#でユニオンを表すには、StructLayout [LayoutKind.Explicit)]および[FieldOffset(x)]属性を使用して、ユニオン内のバイトオフセットを指定する必要があることを理解しています。ただし、表現したい次のユニオンがあり、FieldOffset属性はバイトのサイズだけオフセットされています。

union _myUnion
{
     unsigned int info;
     struct
     {
          unsigned int flag1:1 // bit 0
          unsigned int flag2:1 // bit 1
          unsigned int flag3:1 // bit 2
          unsigned int flag4:1 // bit 3
          unsigned int flag5:1 // bit 4
          unsigned int flag6:1 // bit 5
          .
          .
          .
          unsigned int flag31:1 // bit 31
     }
}

ユニオンの内部構造体でわかるように、少しオフセットできるものが必要なため、FieldOffsetを使用できません。

これに対する解決策はありますか?DLL関数を呼び出そうとしていますが、データ構造体の1つがそのように定義されていて、この結合構造体を最適に表現する方法についてのアイデアが不足していました。

4

3 に答える 3

4

そこには団結は必要ありません。データ用の 1 つのフィールド + プロパティ、ビット単位の「シフト」操作を行う 8 つのプロパティ。次に例を示します。

public uint Value {get;set;}

public uint Flag2 {
   get { return Value >> 2; }
}

等。また、ここで bool が欲しいと思っていただろうか?

通常は、変更可能な構造体を作成しないでください。PInvoke(確かではありませんが) そのための有効なシナリオである可能性があるため、無視します :)

値が実際に 32 ビット以上を使用している場合は、バッキング フィールドを ulong に切り替えることを検討してください。

于 2011-01-28T17:15:37.570 に答える