0

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

4

2 回答 2

1

C++ 结构定义了单个 32 位无符号整数的位。该SetCommonPOP字段实际上是四字节结构的最低有效位。

您不能将其直接转换为 C#,即使使用FieldOffset. 相反,将值视为 auint并执行位操作以读取单独的字段。

这是一个应该更好地解释 C++ 中的位字段的链接, http: //msdn.microsoft.com/en-us/library/ewwyfdbe.aspx

于 2013-10-21T16:41:40.300 回答
0

此代码不安全地将 struct 指针转换为指向 a 的指针uint,然后将指定uint的内容写入该位内存。

这将覆盖重叠字段的前四个字节以保存uint.

unsafe在一个方法中,等效的 C# 代码完全相同。
您也可以简单地设置SetCommonPOP结构的字段;因为它是uint结构的被占用的开头,所以会有相同的效果。

于 2013-10-21T16:21:17.450 回答