我需要将字节数组转换为我的结构类型。为此,我将以下代码用于桌面项目应用程序:
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[] 的函数。
关于c# - 在 Compact Framework 中将字节数组转换为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13418795/