我知道为了在 C# 中表示联合,我需要使用 StructLayout[LayoutKind.Explicit)] 和 [FieldOffset(x)] 属性来指定联合内的字节偏移量。但是,我有一个我想表示的以下联合和 FieldOffset 属性仅偏移一个字节的大小。
union _myUnion
{
unsigned int info;
struct
{
unsigned int flag1:1 // bit 0
unsigned int flag2:1 // bit 1
unsigned int flag3:1 // bit 2
unsigned int flag4:1 // bit 3
unsigned int flag5:1 // bit 4
unsigned int flag6:1 // bit 5
.
.
.
unsigned int flag31:1 // bit 31
}
}
正如您在联合中看到的内部结构,我不能使用 FieldOffset,因为我需要一些可以抵消一点的东西。
有解决办法吗?我正在尝试调用一个 DLL 函数,其中一个数据结构是这样定义的,我想不出如何最好地表示这个联合结构。
最佳答案
那里不需要联合;数据的一个字段+属性,8个属性做按位“移位”操作,例如:
public uint Value {get;set;}
public uint Flag2 {
get { return Value >> 2; }
}
等我还以为你想要 bool 在这里?
通常我会说:不要创建可变结构。 PInvoke 可能(我不确定)是一个有效的场景,所以我会忽略它:)
如果该值确实使用超过 32 位,请考虑将支持字段切换为 ulong。
关于c# - 使用 c# 的 StrucLayout 和 FieldOffset 表示联合位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4830978/