2012-06-24 185 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 *。 –