誰能告訴我怎麼做我下面的結構轉換爲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
誰能告訴我怎麼做我下面的結構轉換爲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
C# does not have unions.。最接近的是使用FieldOffset。但是,如果你的結構沒有被直接傳遞給外部函數,那麼最好使用更多的OO方法。我建議只是用兩種類型的數組創建一個結構,並將你不使用的那個設置爲null。
這是不準確的,[LayoutKind]在常規的C#代碼中工作得很好。 –
我不會說它的工作「很好」,但它確實有效。 – Rook
您將需要查找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來實現的。
其實它是0,因爲我們想要一個* union *。 –
那麼,您可以告訴我們'DES_cblock'是什麼類型。我假設'DES_LONG'是一個簡單的整數類型,但如果你能告訴我們這是什麼也會有所幫助。 – Rook
糟糕.sorry typedef無符號字符DES_cblock [8]是DES_cblock和DES_LONG無符號長 – user1177586