Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的C位字段#_C#_C_Bit Manipulation_Code Conversion - Fatal编程技术网

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

我需要将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;

有人知道怎么做吗?

您可以使用
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) ) ...