2012-06-24 140 views
0

谁能告诉我怎么做我下面的结构转换为C#转换C++结构到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 
+2

那么,您可以告诉我们'DES_cblock'是什么类型。我假设'DES_LONG'是一个简单的整数类型,但如果你能告诉我们这是什么也会有所帮助。 – Rook

+0

糟糕.sorry typedef无符号字符DES_cblock [8]是DES_cblock和DES_LONG无符号长 – user1177586

回答

0

C# does not have unions.。最接近的是使用FieldOffset。但是,如果你的结构没有被直接传递给外部函数,那么最好使用更多的OO方法。我建议只是用两种类型的数组创建一个结构,并将你不使用的那个设置为null。

+0

这是不准确的,[LayoutKind]在常规的C#代码中工作得很好。 –

+0

我不会说它的工作“很好”,但它确实有效。 – Rook

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来实现的。

+2

其实它是0,因为我们想要一个* union *。 –