我有一个C#函数将字节数组转换为类,给定它的类型:
IntPtr buffer = Marshal.AllocHGlobal(rawsize); Marshal.Copy(data,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失败并出现以下错误:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
我猜测使用固定阵列是一种解决方案,但它是否可以在不必诉诸不安全代码的情况下完成?
解决方法
不需要不安全的代码:
[StructLayout(LayoutKind.Sequential)] public struct PacketFormat { public byte header; [MarshalAs(UnmanagedType.ByValArray,SizeConst = 256)] public byte[] data; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。