MarshalHelper

 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