[英]Convert a byte array to a class containing a byte array in C#
我有一个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
失败并出现以下错误:
尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。
我猜测使用固定阵列是一种解决方案,但它是否可以在不必诉诸不安全代码的情况下完成?
不需要不安全的代码:
[StructLayout(LayoutKind.Sequential)]
public struct PacketFormat
{
public byte header;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] data;
}
您需要使用固定大小的字节数组。
[StructLayout(LayoutKind.Sequential)]
public unsafe struct PacketFormat
{
public byte header;
public fixed byte data[256];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.