0

次の構造体をC#に変換する方法を誰か教えてもらえますか

typedef struct DES_ks
{
    union
    {
        DES_cblock cblock;
        /* make sure things are correct size on machines with
         * 8 byte longs */
        DES_LONG deslong[2];
    } ks[16];
} DES_key_schedule
4

2 に答える 2

5

これを変換するには、DES_cblock と DES_LONG の typedef を調べる必要があります。ただし、開始するには、 を読んでくださいStructLayoutAttribute。C の共用体を C# に変換する方法は、明示的なレイアウト構造を使用することです。

[StructLayout(LayoutKind.Explicit)]
public struct DES_ks
{
  [FieldOffset(0)]
  public DES_cblock cblock;
  [FieldOffset(0)]
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
  public DES_LONG[] deslong;
}

私の一時的な狂気を修正してくれた@Konradに感謝します。ユニオンを生成したいので、すべてのフィールドがメモリ内でオーバーラップする必要があります。これは、C# ではコンパイラに同じオフセット (この場合は 0) に配置するように指示することで実現されます。

于 2012-06-24T14:55:42.637 に答える
0

C# には共用体がありません。. 最も近いのは、FieldOffset を使用することです。ただし、構造体が外部関数に直接渡されていない場合は、よりオブジェクト指向のアプローチを使用する方がよいでしょう。両方のタイプの配列を持つ構造体を作成し、使用していないものを null に設定することをお勧めします。

于 2012-06-24T14:54:22.827 に答える