这个算是我的一点小总结吧,放出来分享给大家,原来在网上找这种算法都找了N久没找到,自己写也是走了许多弯路,就放出来遛一遛吧
大家将就这个看看, 这是其中的一个主要的方法,其余的我就不放出来了,其中的IndexTag和endTag分别是首尾字节
public List<Gnss808RequesInfo> Filter(ref byte[] message) { var list = new List<Gnss808RequesInfo>(); //是否退出循环 var isBreak = false; while (true) { //如果缓冲区字节数组为空或者长度为小于1 if (isBreak || message == null) { break; } //首指针 ; ; i < message.Length; i++) { //判断首标识是否正确 && message[i] != IndexTag) { message = null; LogHelper.Instance.Add("分包不正确,丢弃字节"); break; } //如果是结束字符(且不为首字节,区分如果首标识和尾标识相同的情况) && message[i] == EndTag) { var data = new byte[i - flag]; Array.Copy(message, flag + , data, , i - flag); //这个地方其实已经收到一个完整的数据包了 //下面的重载的方法生成规定的数据格式的接口 var request = Filter(data); if (request != null) { list.Add(request); } flag = i; } //该为最后一个字节 ) { if (flag == i) { message = null; } else { //未接收完整的数据包 ]; Array.Copy(message, flag + , data, , data.Length); message = data; // LogHelper.Instance.Add(string.Format("未知:{0}", CommonFunction.GetBcdCodeString(message, 0, message.Length))); } //退出循环 isBreak = true; break; } } } return list; }