2012-11-16 104 views
2

我需要將字節數組轉換爲我的結構類型。要做到這一點,我使用的桌面應用程序項目下面的代碼:將字節數組轉換爲精簡框架中的結構

var str = new SFHeader(); 
int size = Marshal.SizeOf(str); 

IntPtr ptr = Marshal.AllocHGlobal(size); 
Marshal.Copy(buffer, 0, ptr, size); 
str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader)); 
Marshal.FreeHGlobal(ptr); 

return str; 

哪裏SFHeader是我的結構。

的問題是該行:

str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader)); 

拋出一個NotSupportedException當我運行從一個智能設備項目的代碼。還有其他方法可以在Compact Framework中完成這項工作嗎?

[StructLayout(LayoutKind.Sequential)] 
public struct SFHeader 
{ 

    internal const int MAX_FILENAME_LENGTH = 32; 


    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILENAME_LENGTH)] 
    public string FileName; 

    public int Offset; 

    public short Size; 

    public byte Flags; 

    public byte Source; 

    public long LastWriteTime; 

} 

回答

2

Marshal.PtrToStructure作品,我已經用它多次在緊湊的框架。它看起來像你正確使用它。因此,這個問題必須是你的結構定義(東西可能不會在CF的支持的結構)

下面的代碼在使用Windows CE 5.0和.NET CF 3.5

[StructLayout(LayoutKind.Sequential)] 
    public struct SFHeader 
    { 
     internal const int MAX_FILENAME_LENGTH = 32; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILENAME_LENGTH)] 
     public string FileName; 
     public int Offset; 
     public short Size; 
     public byte Flags; 
     public byte Source; 
     public long LastWriteTime; 
    } 

    private static void Test() 
    { 
     var str = new SFHeader(); 
     int size = Marshal.SizeOf(str); 
     byte[] buffer = new byte[size]; 

     IntPtr ptr = Marshal.AllocHGlobal(size); 
     Marshal.Copy(buffer, 0, ptr, size); 
     str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader)); 
     Marshal.FreeHGlobal(ptr); 
    } 
我的設備上就好了

我會檢查以確保您遵循這些準則Marshaling Structures in the .NET Compact Framework

另一種選擇是將字段從您的緩衝區手動複製到您的結構手動逐字節。你可以寫一個函數返回一個SFHeader並且需要一個字節[]。

+0

請參閱編輯。 – Nick

+0

@Nick嗯..你也有C頭文件的定義嗎? – Alan

+0

是的,爲什麼?你想看看C的定義嗎? – Nick