将字节数组转换为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);
}
我会检查以确保您遵循这些指南在.NET Compact Framework中的Marshaling Structures
另一种选择是将缓冲区中的字段逐字节地手动复制到结构中。 你可以写一个函数返回一个SFHeader并且需要一个字节[]。
链接地址: http://www.djcxy.com/p/53683.html上一篇: Convert byte array to structure in the Compact Framework
下一篇: Is Google Analytics for Mobile available for Windows Mobile / Compact Framework