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