将int复制到struct对象

时间:2013-10-21 16:18:44

标签: c# structure managed-c++

我在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#?

2 个答案:

答案 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,所以会产生同样的效果。