10

C 構造体を、ビット フィールドを使用する C# に変換する必要があります。

typedef struct foo  
{  
    unsigned int bar1 : 1;
    unsigned int bar2 : 2;
    unsigned int bar3 : 3;
    unsigned int bar4 : 4;
    unsigned int bar5 : 5;
    unsigned int bar6 : 6;
    unsigned int bar7 : 7;
    ...
    unsigned int bar32 : 32;
} foo;

誰でもこれを行う方法を知っていますか?

4

4 に答える 4

6

この回答この MSDN の記事で説明されているように、BitField

[Flags]
enum Foo
{
    bar0 = 0,
    bar1 = 1,
    bar2 = 2,
    bar3 = 4,
    bar4 = 8,
    ...
}

2 32まで計算するのは少し面倒なので、次のようにすることもできます。

[Flags]
enum Foo
{
    bar0 = 0,
    bar1 = 1 << 0,
    bar2 = 1 << 1,
    bar3 = 1 << 2,
    bar4 = 1 << 3,
    ...
}

また、C で期待されるように、フラグにアクセスできます。

Foo myFoo |= Foo.bar4;

そして、.NET 4 の C# は、メソッドを使用して骨を投げますHasFlag()

if( myFoo.HasFlag(Foo.bar4) ) ...
于 2013-05-15T18:36:51.053 に答える
3

BitArrayフレームワークのクラスを使用できます。msdnの記事を見てください。

于 2011-02-25T10:17:02.960 に答える
-1

残念ながら、C#にはそのようなものはありません。最も近いのは、StructLayout属性を適用し、フィールドにFieldOffset属性を使用することです。ただし、フィールドオフセットはビット単位ではなくバイト単位です。次に例を示します。

[StructLayout(LayoutKind.Explicit)]
struct MyStruct
{
    [FieldOffset(0)]
    public int Foo; // this field's offset is 0 bytes

    [FieldOffset(2)]
    public int Bar; // this field's offset is 2 bytes. It overlaps with Foo.
}

しかし、それはあなたが望む機能と同じではありません。

ビットシーケンスを構造体にデコードする必要がある場合は、手動コードを作成する必要があります(たとえば、MemoryStreamやBitConverterなどのクラスを使用します)。

于 2011-02-25T10:20:16.703 に答える
-2

FieldOffset属性をお探しですか?ここを参照してください:FieldOffsetAttributeクラス

于 2011-02-25T10:19:26.403 に答える