C#四字节头通信数据包的组装与接收

   internal class Program
   {
       static async Task Main(string[] args)
       {
           string msg = "123456789";
           byte[] bb = Encoding.UTF8.GetBytes(msg);
           byte[] newData = GetResponse(bb);
           ReciveFullPacketEvent += Program_ReciveFullPacketEvent;
           Test(newData);
           while (true)
           {
               byte[] aa = newData.Take(2).ToArray();
               Test(aa);
               await Task.Delay(1000);
               byte[] cc = newData.Skip(2).ToArray();
               Test(cc);
           }
           Console.ReadKey();
       }

       private static void Program_ReciveFullPacketEvent(byte[] arg1, byte[] arg2)
       {
           string res = Encoding.UTF8.GetString(arg2);
           Console.WriteLine(res);
       }

       static List<byte> cache = new List<byte>();
       static public event Action<byte[], byte[]>? ReciveFullPacketEvent;
       static int _headerSize = 4;
       public static void Revice(byte[] bb)
       {
           cache.AddRange(bb);
       }
       /// <summary>
       /// 测试4字节包头 处理数据
       /// </summary>
       /// <param name="bb"></param>
       public static void Test(byte[] bb)
       {
           Revice(bb);
           do
           {
               if (cache.Count < _headerSize)
               {
                   break;
               }
               var header = cache.GetRange(0, _headerSize).ToArray();
               var bodySize = BitConverter.ToInt32(header, 0);
               var fullSize = bodySize + _headerSize;
               if (cache.Count < fullSize)
               {
                   break;
               }
               if (cache.Count >= fullSize)
               {
                   var bodyData = cache.GetRange(_headerSize, bodySize).ToArray();//真正的包体数据
                   ReciveFullPacketEvent?.Invoke(header, bodyData);//处理数据
                   cache.RemoveRange(0, fullSize);//删除已经处理的数据
                   if (cache.Count == 0)
                   {
                       break;
                   }
               }
           } while (true);
       }


       public static byte[] GetResponse(byte[] data)
       {
           List<byte> list = new List<byte>();
           byte[] collection = BitConverter.GetBytes((uint)data.Length).ToArray();
           list.AddRange(collection);
           list.AddRange(data);
           return list.ToArray();
       }
   }

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值