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 union 转换为 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。但是,如果您的结构没有直接传递给外部函数,那么您最好使用更面向对象的方法。我建议只使用两种类型的数组创建一个结构,并将您不使用的数组设置为空。

于 2012-06-24T14:54:22.827 回答