首页 > 代码库 > 根据首尾字节的tcp分包断包算法
根据首尾字节的tcp分包断包算法
这个算是我的一点小总结吧,放出来分享给大家,原来在网上找这种算法都找了N久没找到,自己写也是走了许多弯路,就放出来遛一遛吧
大家将就这个看看, 这是其中的一个主要的方法,其余的我就不放出来了,其中的IndexTag和endTag分别是首尾字节
1 public List<Gnss808RequesInfo> Filter(ref byte[] message) 2 { 3 var list = new List<Gnss808RequesInfo>(); 4 //是否退出循环 5 var isBreak = false; 6 while (true) 7 { 8 //如果缓冲区字节数组为空或者长度为小于1 9 if (isBreak || message == null)10 {11 break;12 }13 //首指针14 var flag = -1;15 for (var i = 0; i < message.Length; i++)16 {17 //判断首标识是否正确18 if (i - flag == 1 && message[i] != IndexTag)19 {20 message = null;21 LogHelper.Instance.Add("分包不正确,丢弃字节");22 break;23 }24 //如果是结束字符(且不为首字节,区分如果首标识和尾标识相同的情况)25 if (i - flag != 1 && message[i] == EndTag)26 {27 var data = http://www.mamicode.com/new byte[i - flag];28 Array.Copy(message, flag + 1, data, 0, i - flag);29 //这个地方其实已经收到一个完整的数据包了30 //下面的重载的方法生成规定的数据格式的接口31 var request = Filter(data);32 if (request != null)33 {34 list.Add(request);35 }36 flag = i;37 }38 //该为最后一个字节39 if (i == message.Length - 1)40 {41 if (flag == i)42 {43 message = null;44 }45 else46 {47 //未接收完整的数据包48 var data = http://www.mamicode.com/new byte[message.Length - flag - 1];49 Array.Copy(message, flag + 1, data, 0, data.Length);50 message = data;51 // LogHelper.Instance.Add(string.Format("未知:{0}", CommonFunction.GetBcdCodeString(message, 0, message.Length)));52 }53 //退出循环54 isBreak = true;55 break;56 }57 }58 }59 return list;60 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。