序列化包
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;
}