C#中的C位字段

时间:2011-02-25 10:12:28

标签: c# c bit-manipulation code-conversion

我需要将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 个答案:

答案 0 :(得分:5)

正如this answerthis MSDN article中所述,您可能正在寻找以下内容而不是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) ) ...

答案 1 :(得分:3)

您可以将BitArray类用于框架。请查看msdn文章。

答案 2 :(得分:-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等类)。

答案 3 :(得分:-2)

您在寻找FieldOffset属性吗?见这里:FieldOffsetAttribute Class