C#中的C位域

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;

请问有人知道如何做到这个吗?


3
已经在 C# 中的位域 中回答了。 - Aasmund Eldhuset
2
希望您知道,您正在分配1 + 2 + 3.. + 32位 = 528位= 66字节。 - Lundin
1
@Lundin:这只是一个例子,我想指出我拥有所有可能的位域变体。 - David
1
你是否试图编排数据?如果没有,你可以编写自己的“BitField”类,这将非常简单。 - Marlon
我猜你需要先澄清你打算如何使用这个“struct”。 - John Alexiou
显示剩余2条评论
4个回答

8

正如这个回答这篇MSDN文章所解释的那样,你可能需要使用以下内容而不是BitField

[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,
    ...
}

您可以像在C语言中一样访问您的标志:

Foo myFoo |= Foo.bar4;

在.NET 4中,C#为您提供了一个有用的方法HasFlag()来处理相关问题。
if( myFoo.HasFlag(Foo.bar4) ) ...

3
您可以使用框架中的BitArray类。请查看msdn文章。

谢谢,但如果我必须声明每个位,那会很麻烦。 - David

-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之类的类)。


如果你需要将一个比特序列解码成一个结构体,你就必须编写手动代码(例如使用类似MemoryStream或BitConverter的类)。好吧,这正是我想要的。 - David

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接