1 public class MarshalHelper
 2     {
 3         /// <summary>
 4         /// 结构体转byte数组
 5         /// </summary>
 6         /// <param name=”structObj”>要转换的结构体</param>
 7         /// <returns>转换后的byte数组</returns>
 8         public static byte[] StructToBytes(object structObj)
 9         {
10             //得到结构体的大小
11             int size = Marshal.SizeOf(structObj);
12             //创建byte数组
13             byte[] bytes = new byte[size];
14             //分配结构体大小的内存空间
15             IntPtr structPtr = Marshal.AllocHGlobal(size);
16             //将结构体拷到分配好的内存空间
17             Marshal.StructureToPtr(structObj, structPtr, false);
18             //从内存空间拷到byte数组
19             Marshal.Copy(structPtr, bytes, 0, size);
20             //释放内存空间
21             Marshal.FreeHGlobal(structPtr);
22             //返回byte数组
23             return bytes;
24         }
25
26         /// <summary>
27         /// byte数组转结构体
28         /// </summary>
29         /// <param name=”bytes”>byte数组</param>
30         /// <param name=”offset”>结构体在数组的开始位置</param>
31         /// <param name=”type”>结构体类型</param>
32         /// <returns>转换后的结构体</returns>
33         public static object BytesToStuct(byte[] bytes, int offset, Type type)
34         {
35              //得到结构体的大小
36              int size = Marshal.SizeOf(type);
37              //byte数组长度小于结构体的大小
38              if (size > bytes.Length)
39              {
40                 //返回空
41                 return null;
42              }
43              //分配结构体大小的内存空间
44              IntPtr structPtr = Marshal.AllocHGlobal(size);
45              //将byte数组拷到分配好的内存空间
46              Marshal.Copy(bytes, offset, structPtr, size);
47              //将内存空间转换为目标结构体
48              object obj = Marshal.PtrToStructure(structPtr, type);
49              //释放内存空间
50              Marshal.FreeHGlobal(structPtr);
51              //返回结构体
52              return obj;
53         }
54     }

转载于:https://www.cnblogs.com/lizhi0755/p/3164807.html

MarshalHelper相关推荐

最新文章

  1. opencv仿射变换
  2. Java学习总结:6
  3. ECSHOP在商品详细页面上获取该商品的顶级分类id和名称
  4. xmlstreamexception 参数实体未进行声明_命名实体识别研究进展概述
  5. linux nexus启动_Linux一键部署Nexus 3私服仓库自动化部署脚本
  6. IT基础架构规划方案二(计算机系统与机房规划规划)
  7. Sql Server 2008完全卸载方法(其他版本类似)
  8. 离散数学及其应用第六版中文电子书和答案
  9. 《自己动手写操作系统》之 10分钟完成最小的操作系统
  10. 计算机毕业设计之java+javaweb的房屋出租系统
  11. SIM868 GPS模块指令中文解释
  12. 年度Sweb绩效考评表
  13. 自然语言处理NLPIR-ICTCLAS 授权文件过期问题
  14. python的print输出格式举例_python中print输出格式是什么
  15. 【choco 安装】chocolatey 安装步骤包管理工具
  16. pythonrequests请求https错误_如何解决python之requests安全证书(HTTPS请求)问题?
  17. 哪款蓝牙耳机戴着舒服?佩戴舒适度高的四款蓝牙耳机推荐
  18. linux创建任务栏图标
  19. adobe的AGAL语言
  20. python ipaddress模块简介

热门文章

  1. 继承,is,as,多态
  2. linux中常用的头文件
  3. Delphi中禁止WebBrowser右键的方法
  4. linux gcc 7.3.0安装,升级gcc到7.3.0
  5. spss方差分析_【案例】SPSS统计分析:多因素方差分析
  6. python如何读二进制文件_python怎么读二进制文件
  7. C++ set的一些用法
  8. 查看linux服务器的系统信息
  9. c语言float二进制输出代码_下面C语言中这十四大谜题,不看答案你能做出来吗?...
  10. [MySQL]经常无故崩溃amd.dll , boot1.exe病毒