using System.Collections.Generic;
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Reflection;
using System.Runtime.InteropServices;
public class ByteConvertHelper
{
/// <summary>
/// 将结构体对象转换为byte数组
/// </summary>
/// <param name="obj">被转换对象</param>
/// <returns>转换后byte数组</returns>
public static byte[] Object2Bytes(object obj)
{
int size = Marshal.SizeOf(obj);
byte[] bytes = new byte[1024];
IntPtr structPtr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(obj, structPtr, false);
Marshal.Copy(structPtr, bytes, 0, size);
Marshal.FreeHGlobal(structPtr);
return bytes;
}
/// <summary>
/// 将byte数组转换成对象
/// </summary>
/// <param name="buff">被转换byte数组</param>
/// <param name="typ">转换成的类名</param>
/// <returns>转换完成后的对象</returns>
public static object Bytes2Object(byte[] buff , Type type)
{
int size = Marshal.SizeOf(type);
if(size > buff.Length)
{
return null;
}
IntPtr structPtr = Marshal.AllocHGlobal(size);
Marshal.Copy(buff, 0, structPtr, size);
object obj = Marshal.PtrToStructure(structPtr, type);
Marshal.FreeHGlobal(structPtr);
return obj;
}
}
//------------------------------------------------------------------
//下面是结构体的类定义
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace ChatServer
{
public enum CurrentStatus
{
Serching,
Playing,
Free,
}
public enum PlayerSide
{
Left,
Right,
}
public class PlayerData
{
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] //必须要写,保证结构体的保存在内存中的方式
public struct PlayerStat
{
public float PositionX;
public float PositionY;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] //必须要写,不然字符串没法解析
public string Name;
public CurrentStatus status;
public PlayerSide side;
}
}
}