Socket开发关于序列化反序列化包

本文介绍了一种网络通信中数据包的序列化与解析方法,包括将数据包转换为字节流以及从字节流中恢复数据包的过程。通过BitConverter类实现ID和长度字段的转换,并使用Buffer.BlockCopy进行字节复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序列化包

public byte[] BuidPacketToBytes(Packet packet, int IdAndLength)

    {
     
        byte[] packtIdBytes = BitConverter.GetBytes(packet.ID);
        byte[] packetLengthBytes = BitConverter.GetBytes(packet.Length);
        byte[] buildPacketBytes = null;
        if (packet.Length > IdAndLength)//要发送的消息长度至少要大于4,这里是ushort类型
        {
            buildPacketBytes = new byte[packtIdBytes.Length + packetLengthBytes.Length + packet.PacketBytes.Length];
            Buffer.BlockCopy(buildPacketBytes, 0, buildPacketBytes, 0, packtIdBytes.Length);
            Buffer.BlockCopy(packetLengthBytes, 0, buildPacketBytes, packtIdBytes.Length, packetLengthBytes.Length);
            Buffer.BlockCopy(packet.PacketBytes, 0, buildPacketBytes, packtIdBytes.Length + packetLengthBytes.Length, packet.PacketBytes.Length);
            Debug.Log("*" + string.Format("id={0},length={1},bytes={2}", packet.ID, packet.Length, packet.PacketBytes.Length));
        }
        return buildPacketBytes;

    }

//解析包

 public Packet ParseToPacket(byte[] data, int Len)
    {
        Packet packet = null;
        if (data.Length > Len)//这里是协议号+长度,都已经大于4了,如果小于4;注意:这里是用的ushort
        {
            int ulen = Len / 2;
            packet = new Packet();
            int readIndex = 0;
            byte[] packetID = new byte[ulen];//ushort ,所以是2,如果是int,改为4
            Buffer.BlockCopy(data, 0, packetID, 0, ulen);

            packet.ID = BitConverter.ToUInt16(packetID, 0);//如果是int改为ToUInt32

            readIndex += ulen;

            //长度对应的字节数组
            byte[] packetLength = new byte[ulen];
            Buffer.BlockCopy(data, readIndex, packetLength, 0, ulen);// ushort , 所以是2,如果是int,改为4
            packet.Length = BitConverter.ToUInt16(packetLength, 0);//如果是int改为ToUInt32

            Buffer.BlockCopy(data, readIndex, packet.PacketBytes, 0, packet.Length - readIndex);
        }
        return packet;
    }

    /// <summary>
    /// 解析从网络收到的完整数据包
    /// </summary>
    public T ParseToProtobufObject<T>(byte[] data, int len)
    {
        T protobuf = default(T);
        if (data.Length > len)//一定要大于协议号+长度的大小,这里4是ushort+ushort
        {
            Packet packet = ParseToPacket(data, len);
            protobuf = SerializableManager.GetInstance().DisSerializabelProtobuf<T>(packet.PacketBytes);
        }
        return protobuf;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值