/// <summary>
/// 构造包 包头+包尾
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static byte[] EncodePacket(byte[] data)
{
using (MemoryStream ms = new MemoryStream())
{
using (BinaryWriter bw = new BinaryWriter(ms))
{
//写入包头:数据的长度
bw.Write(data.Length);
//写入包尾:数据
bw.Write(data);
ms.GetBuffer();
byte[] packet = new byte[ms.Length];
Buffer.BlockCopy(ms.GetBuffer(), 0, packet, 0, (int)ms.Length);
return packet;
}
}
}
/// <summary>
/// 解析包,从缓冲区取出一个完整的包
/// </summary>
/// <param name=""></param>
/// <returns></returns>
public static byte[] DecodePacket(ref List<byte> cache)
{
if (cache==null)
{
return null;
}
if (cache.Count < 4)
{
return null;
}
using (MemoryStream ms = new MemoryStream(cache.ToArray()))
{
using (BinaryReader br = new BinaryReader(ms))
{
byte[] data = null;
try
{
int length = br.ReadInt32();
int remainLength = (int)(ms.Length - ms.Position);
if (length > remainLength)
{
return null;
}
try
{
if (length<0)
{
Debug.LogError("消息体长度小于0,长度为:{0}", length);
}
data = br.ReadBytes(length);
}
catch (Exception e)
{
Debug.LogError("解析包时,读取字节流出错,原因:{0}", e.Message);
return null;
}
//更新数据缓存
cache.Clear();
int remianLengthAgain = (int)(ms.Length - ms.Position);
cache.AddRange(br.ReadBytes(remianLengthAgain));
}
catch (Exception e)
{
Debug.LogError("解析包时,更新数据缓存失败,原因:{0}", e.Message);
return null;
}
return data;
}
}
}