C#中常用結構體與字節數組轉換輔助函數

/// <summary>
/// 結構體轉換爲字節數組
/// </summary>
/// <typeparam name="T">結構體類型</typeparam>
/// <param name="obj">結構體對象</param>
/// <returns>字節數組</returns>
internal static byte[] StructToBytes<T>(T obj)
{
	return StructToBytes(obj, Marshal.SizeOf(typeof(T)));
}

/// <summary>
/// 結構體轉換爲字節數組
/// </summary>
/// <param name="obj">結構體對象</param>
/// <param name="objSize">結構體長度</param>
/// <returns>字節數組</returns>
internal static byte[] StructToBytes(object obj, int objSize)
{
	byte[] arr = new byte[objSize];
	IntPtr ptr = Marshal.AllocHGlobal(objSize);
	try
	{
		Marshal.StructureToPtr(obj, ptr, false);
		Marshal.Copy(ptr, arr, 0, objSize);
	}
	finally
	{
		Marshal.FreeHGlobal(ptr);
	}

	return arr;
}

/// <summary>
/// 字節數組轉換爲結構體
/// </summary>
/// <typeparam name="T">結構體類型</typeparam>
/// <param name="arr">字節數組</param>
/// <param name="length">字節數組長度 爲零時自動求值</param>
/// <returns>結構體對象</returns>
internal static T BytesToStruct<T>(byte[] arr, int length = 0)
{
	int size = length <= 0 ? arr.Length : length;
	IntPtr ptr = Marshal.AllocHGlobal(size);
	T stru = default(T);
	try
	{
		Marshal.Copy(arr, 0, ptr, size);
		stru = (T)Marshal.PtrToStructure(ptr, typeof(T));
	}
	finally
	{
		Marshal.FreeHGlobal(ptr);
	}

	return stru;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章