我有一个C#函数将字节数组转换为类,给定它的类型:
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.Copy(data, 0, buffer, rawsize);
object result = Marshal.PtrToStructure(buffer, type);
Marshal.FreeHGlobal(buffer);
我使用顺序结构:
[StructLayout(LayoutKind.Sequential)]
public new class PacketFormat : Packet.PacketFormat { }
这很好用,直到我尝试转换为包含字节数组的结构/类。
[StructLayout(LayoutKind.Sequential)]
public new class PacketFormat : Packet.PacketFormat
{
public byte header;
public byte[] data = new byte[256];
}
Marshal.SizeOf(type)
返回16,这太低了(应该是257)并导致Marshal.PtrToStructure
失败并出现以下错误:
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
我猜测使用固定阵列是一种解决方案,但它是否可以在不必诉诸不安全代码的情况下完成?
答案 0 :(得分:5)
不需要不安全的代码:
[StructLayout(LayoutKind.Sequential)]
public struct PacketFormat
{
public byte header;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] data;
}
答案 1 :(得分:4)
您需要使用固定大小的字节数组。
[StructLayout(LayoutKind.Sequential)]
public unsafe struct PacketFormat
{
public byte header;
public fixed byte data[256];
}