0

嗨,我有这个结构

 [StructLayout (LayoutKind.Sequential)]
 public struct Transfer_packet 
        {
            public int  _packet_type; // 0 is action 1 is data
            public int _packet_len; // length of data
            public byte[] _data;//;= new byte[DataLenght];
            public void fill()
            {

            }
            public byte[] deserialize()
            {
                int size = System.Runtime.InteropServices.Marshal.SizeOf(this);
                byte[] arr = new byte[size];
                IntPtr ptr = System.Runtime.InteropServices.Marshal.AllocHGlobal(size);
                System.Runtime.InteropServices.Marshal.StructureToPtr(this, ptr, true);  // error raised
                System.Runtime.InteropServices.Marshal.Copy(ptr,arr,0,size);
                System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr);
                return arr;
            }
        }

我正在尝试将结构的内容转换为字节数组,以便通过网络发送它并在另一台计算机上检索它,但在代码中(如上所述)我得到了一个错误:

尝试读取或写入受保护的内存。

这通常表明某些内存已损坏。我不知道为什么,对我来说一切都很好,但元帅正试图访问受保护的内存......

如何将结构实例转换为字节数组?我用简单的 C++ 完美地完成了它,memcpy但在 C# 中我做不到。

4

1 回答 1

1

true参数要求框架删除源内存。当然,这个内存不是由编组器分配的,所以它失败了。请尝试以下操作:

System.Runtime.InteropServices.Marshal.StructureToPtr(this, ptr, false);
于 2013-03-09T14:53:30.573 回答