首页 > 代码库 > 根据首尾字节的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         }