using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace EncodeTool{
///
/// 关于编码的工具类
///
public static class EncodeTools {
#region 粘包拆包问题 封装一个有规定的数据包
///
/// 构造包体: 包头 + 包尾
//////
public static byte[] EncodePacket(byte[] data)
{ // 内存流对象
using (MemoryStream ms = new MemoryStream())
{
using (BinaryWriter bw = new BinaryWriter(ms))
{ //先写入长度
bw.Write(data.Length);
//再写入数据
bw.Write(data);
byte[] byteArray = new byte[(int)ms.Length];
Buffer.BlockCopy(ms.GetBuffer(),0,byteArray,0,(int)ms.Length);
return byteArray;
}
}
}
////// 解析包体,从缓存里取出一个一个完整的数据包
/// 这里的形参dataCache引用的是客户端里定义的服务端发送的数据缓存区,在这里修改直接改变其数值
//////
public static byte[] DecodePacket(ref ListdataCache)
{
// 四个字节构成一个int长度 <4不能构成一个完整的消息
if (dataCache.Count < 4)
throw new Exception("数据缓存长度不足4 不能构成一个完整的消息");
using (MemoryStream ms = new MemoryStream())
{
using (BinaryReader br = new BinaryReader(ms))
{
int length = br.ReadInt32();
// 剩余的长度
int dataReminLength = (int)(ms.Length - ms.Position);
if (length > dataReminLength)
throw new Exception("数据长度不够包头约定的长度, 不能构成一个完整的消息");
byte[] data = br.ReadBytes(length);
//更新一下数据缓存
dataCache.Clear();
dataCache.AddRange(br.ReadBytes(dataReminLength));
return data;
}
}
}
#endregion
}
}