using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using UnityEngine;
public static class BytesHelper
{
////
/// 结构体转byte数组
///
/// 要转换的结构体
/// 转换后的byte数组
public static byte[] StructToBytes(T structObj) where T : struct
{
//得到结构体的大小
int size = Marshal.SizeOf(structObj);
//创建byte数组
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false);
//从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return bytes;
}
///
/// byte数组转结构体
///
/// byte数组
/// 结构体类型
/// 转换后的结构体
public static T BytesToStuct(byte[] bytes) where T :struct
{
//得到结构体的大小
int size = Marshal.SizeOf();
//byte数组长度小于结构体的大小
if (size > bytes.Length)
{
//返回空
return default;
}
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将byte数组拷到分配好的内存空间
Marshal.Copy(bytes, 0, structPtr, size);
//将内存空间转换为目标结构体
T obj = Marshal.PtrToStructure(structPtr);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回结构体
return obj;
}
/////
///// 将一个object对象序列化,返回一个byte[]
/////
///// 能序列化的对象
/////
//public static byte[] ObjectToBytes(object obj)
//{
// if (obj == null) return null;
// using (MemoryStream ms = new MemoryStream())
// {
// IFormatter formatter = new BinaryFormatter();
// formatter.Serialize(ms, obj);
// return ms.GetBuffer();
// }
//}
/////
///// 将一个序列化后的byte[]数组还原
/////
/////
/////
//public static object BytesToObject(byte[] Bytes)
//{
// using (MemoryStream ms = new MemoryStream(Bytes))
// {
// IFormatter formatter = new BinaryFormatter();
// return formatter.Deserialize(ms);
// }
//}
public static byte[] ClassToBytes(T msg)
{
return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(msg));
}
public static T BytesToClass(byte[] bytes) where T : class
{
return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(bytes));
}
}