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

标签 c# union bit-fields

我知道为了在 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/

相关文章:

arrays - 使用自定义规则执行两个数组的并集

c++ - 位域内存

c# - 自不可空引用以来的事件指南

c# - 显式加载 N :M with Filtering

c# - FirstOrDefault/First 和 OrderByDescending 是否比 LastOrDefault/Last 和 OrderBy 更快?

php - 将不同表的不同字段存储到临时表中

c# - Visual Studio 在 Rebuild 上从依赖项项目复制 "Content"文件,但在 Build 上不复制

MySQL 单列 n-gram 拆分和计数

c - c中的结构默认值

c - 警告只有一个位域,而不是两个?