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 }