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

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) ) ...
于 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 回答