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

0

このコードは、構造体ポインターを へのポインターに安全に変換せず、指定された をそのメモリのビットにuint書き込みます。uint

これにより、オーバーラップしたフィールドの最初の 4 バイトが上書きされ、 の値が保持されますuint

unsafe同等の C# コードは、メソッド内ではまったく同じです。構造体のフィールドを
単純に設定することもできます。SetCommonPOPそれuintは構造体の先頭を占有しているため、同じ効果があります。

于 2013-10-21T16:21:17.450 に答える