我需要将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;
有人知道怎么做吗?
答案 0 :(得分:5)
正如this answer和this 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