[英]Convert byte array to structure in the Compact Framework
我需要將字節數組轉換為我的結構類型。 為此,我將以下代碼用於桌面項目應用程序:
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;
}
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 並采用 byte[] 的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.