在C#中将字节数组转换为包含字节数组的类

时间:2010-05-02 23:16:08

标签: c# serialization struct

我有一个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失败并出现以下错误:

  

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

我猜测使用固定阵列是一种解决方案,但它是否可以在不必诉诸不安全代码的情况下完成?

2 个答案:

答案 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];
}