C# C中的C位字段#
我需要将C结构转换为使用位字段的C#C# C中的C位字段#,c#,c,bit-manipulation,code-conversion,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; ... unsig
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;
有人知道怎么做吗?您可以使用
BitArray
类作为框架。请看这篇文章。您正在查找字段偏移量
属性吗?请看这里:不幸的是,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之类的类)。如和中所述,您可能需要查找以下内容,而不是
位字段
[Flags]
enum Foo
{
bar0 = 0,
bar1 = 1,
bar2 = 2,
bar3 = 4,
bar4 = 8,
...
}
由于计算出232可能有点烦人,您也可以这样做:
[Flags]
enum Foo
{
bar0 = 0,
bar1 = 1 << 0,
bar2 = 1 << 1,
bar3 = 1 << 2,
bar4 = 1 << 3,
...
}
NET 4中的C#使用HasFlag()
方法抛出一根骨头
if( myFoo.HasFlag(Foo.bar4) ) ...
已回答。我希望您知道您正在分配1+2+3+32位=528位=66字节。@Lundin:这只是一个例子,我只是想指出我有所有可能的位域变体。@Aasmund Eldhustet:是的,我已经看过这篇文章,但我不明白他为什么要将所有UINT转换成一个长的。你在尝试封送数据吗?如果没有,您可以编写自己的
位域
类,这将非常简单。谢谢,但如果我必须声明每一个位,那将是一件痛苦的事情。>如果您需要将位序列解码为结构,则必须编写手动代码(例如,使用MemoryStream或BitConverter之类的类)。这就是我要找的。
if( myFoo.HasFlag(Foo.bar4) ) ...