编程语言
首页 > 编程语言> > 使用c#的StrucLayout和FieldOffset表示联合位域

使用c#的StrucLayout和FieldOffset表示联合位域

作者:互联网

我理解为了在C#中表示联合,我需要使用StructLayout [LayoutKind.Explicit]]和[FieldOffset(x)] attribut来指定联合内部的字节偏移量.但是,我有一个我想要表示的跟随联合,而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; }
}

等我还以为你想要布尔这里?

通常我会说:不要制作可变的结构. PInvoke可能(我不确定)是一个有效的场景,所以我会忽略它:)

如果该值真正使用超过32位,请考虑将支持字段切换为ulong.

标签:c,union,bit-fields
来源: https://codeday.me/bug/20190518/1128887.html