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 }
?