c#中利用结构体进行socket传输数据

using System.Collections;
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;
        }
    }
}




猜你喜欢

转载自blog.csdn.net/q568360447/article/details/73799799
今日推荐