我在C ++中有一个结构定义,如下所示
typedef struct
{
unsigned __int32 SetCommonPOP:1;
unsigned __int32 SetCommonSVP:1;
unsigned __int32 SetCommonUHDP:1;
unsigned __int32 SetCommonMHDP:1;
unsigned __int32 MinPwdLength:8;
unsigned __int32 MaxPwdLength:8;
unsigned __int32 StoredHdpBackups:8;
} HPM_PWD_CONSTRAINTS;
我将其翻译为c#,如下所示
[StructLayout(LayoutKind.Explicit, Size=28, CharSet=CharSet.Ansi)]
public struct HPM_PWD_CONSTRAINTS
{
[FieldOffset(0)] public uint SetCommonPOP;
[FieldOffset(1)] public uint SetCommonSVP;
[FieldOffset(2)] public uint SetCommonUHDP;
[FieldOffset(3)] public uint SetCommonMHDP;
[FieldOffset(4)] public uint MinPwdLength;
[FieldOffset(12)] public uint MaxPwdLength;
[FieldOffset(20)] public uint StoredHdpBackups;
};
我转换为c#的c ++代码定义了这个结构的对象PWD,并将int x的值传递给该对象。
*((uint*)&PWD) = x;
这是如何工作的?在此之后结构对象的价值是多少?如何将其转换为C#?
答案 0 :(得分:1)
C ++结构定义了一个32位无符号整数的位。 SetCommonPOP
字段实际上是四字节结构中最低有效位。
即使使用FieldOffset
,也无法将其直接转换为C#。相反,将值视为uint
并执行位操作以读取单独的字段。
这是一个更好地解释C ++中的位字段的链接,http://msdn.microsoft.com/en-us/library/ewwyfdbe.aspx
答案 1 :(得分:0)
此代码将struct指针不安全地转换为指向uint
的指针,然后将指定的uint
写入该内存位。
这会覆盖重叠字段的前四个字节,以保存uint
的值。
在unsafe
方法中,等效的C#代码完全相同
您也可以简单地设置结构的SetCommonPOP
字段;因为它占据了结构的开头uint
,所以会产生同样的效果。