2010-04-09 52 views
0

我有這樣一個C++結構:互操作結構:如果無符號短映射到byte []?

typedef struct _FILE_OP_BLOCK 
{                               
    unsigned short fid;  // objective file ID 
    unsigned short offset; // operating offset 
    unsigned char len;  // buffer length(update) 
          // read length(read)   
    unsigned char buff[240]; 
} FILE_OP_BLOCK; 

,現在我想給它的.Net映射。棘手的是,我應該通過一個2字節數組fid和整數爲len,即使在C#fidunsigned shortlenunsigned char

我不知道我的結構(C#)是否低於正確?

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)] 
    public struct File_OP_Block 
    { 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] 
     public byte[] fid; 

     public ushort offset; 

     public byte length; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 240)] 
     public char[] buff; 
    } 
+1

爲什麼使用byte [2]而不是ushort/UInt16? – jweyrich 2010-04-09 07:23:41

+0

@jweyrich,這是因爲某些原因,C++代碼將一個雙字節數組分配給'fid'。 – Graviton 2010-04-09 07:29:41

回答

1

您的[DllImport]屬性上的CharSet屬性肯定是錯誤的,您需要CharSet.Ansi才能讓P/Invoke編組器將其轉換爲char []。將buff成員聲明爲一個字符串以方便使用。雖然將fid成員聲明爲byte []沒有錯,但我真的沒有看到它的重點。非託管代碼將char []複製到它中是一個實現細節。因此:

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] 
public struct File_OP_Block 
{ 
    public ushort fid; 
    public ushort offset; 
    public byte length; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 240)] 
    public string buff; 
} 
0

鑑於C++ short數據類型實際上是兩個字節,應該有兩個字節的數組。 C/C++中的整數大小沒有嚴格定義,因此該標準僅說明short至少有兩個字節。

C#char數據類型是一個16位unicode字符,因此它與8位數據類型的C++ char數據類型不匹配。您需要一個屬性來指定字符如何編碼爲字節,或使用字節數組。

您可能需要一個屬性來指定打包,以便成員之間沒有填充。

+0

我已經把一個屬性,不知道這是否正確。 – Graviton 2010-04-09 07:31:00

+0

@Ngu Soon Hui:佈局設置看起來正確。您應該使用Charset.Ansi來獲取8位字符集。 – Guffa 2010-04-09 07:36:16

+0

只是想知道,如何使用字節數組,而不是屬性? – Graviton 2010-04-09 07:49:51