根据首尾字节的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 = 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                         else

46                         {

47                             //未接收完整的数据包

48                             var data = 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         }

 

你可能感兴趣的:(tcp)