Marshal.PtrToStructure尝试写入受保护的内存

u011021100 2016-09-13 03:34:19
大家好,我首先使用了Marshal.StructureToPtr这个方法把一个结构转化成了byte数组,然后我把这个byte数组写入到了文件里。之后我又写了一个程序,从dat文件中取出这个类的byte[]数组, 想把这个数组转化成为结构体,
主要方法如下。
public static Object BytesToStruct(Byte[] bytes, Type strcutType)
{
Int32 size = Marshal.SizeOf(strcutType);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, buffer, size);
return Marshal.PtrToStructure(buffer, strcutType);
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
可是在转化的过程中,要么就是报尝试写入受保护的内存,要么就是获取不到数据,要么就是报 在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符。这三个错误随机出现,我已经蒙了,请大神给我看看。
...全文
535 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
u011021100 2016-09-13
  • 打赏
  • 举报
回复
引用 4 楼 u012948520 的回复:
Int32 size = Marshal.SizeOf(strcutType);
是一个数据的长度,所以申请空间应该乘以数组长度 我没验证,猜的
引用 3 楼 u012948520 的回复:
IntPtr buffer = Marshal.AllocHGlobal(size);
改成
IntPtr buffer = Marshal.AllocHGlobal(size * bytes.Lenth);
试试
嗯,自己解决了。结构里面string没有定长,导致出现这种情况,定长就解决了。 在字段前面加 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string str; 就可以了,不过还是衷心的谢谢各位。
白衣如花 2016-09-13
  • 打赏
  • 举报
回复
Int32 size = Marshal.SizeOf(strcutType);
是一个数据的长度,所以申请空间应该乘以数组长度 我没验证,猜的
白衣如花 2016-09-13
  • 打赏
  • 举报
回复
IntPtr buffer = Marshal.AllocHGlobal(size);
改成
IntPtr buffer = Marshal.AllocHGlobal(size * bytes.Lenth);
试试
u011021100 2016-09-13
  • 打赏
  • 举报
回复
引用 1 楼 x8bits 的回复:
或许是你的structure定义有误
有一个很奇怪的问题,就是我把写入文件的代码和读取文件的代码写在一起,写完文件之后立刻读取,发现是没有错误的!可是一分开,写文件的程序没有出问题,可读文件的程序还是出上面的问题。。。
x8bits 2016-09-13
  • 打赏
  • 举报
回复
或许是你的structure定义有误

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧