BytesIO | C# 优雅处理通信中的粘包和断包(三)—— 处理使用结束符的协议(完整源码+视频教程)

8 篇文章 65 订阅

C# 优雅处理通信中的粘包和断包(三) 处理使用结束符的协议

在这里插入图片描述


前言

之前我们已经讲过了两种常见的协议格式,分别是 固定长度的协议非固定长度的协议
今天我们来讲第三种常见的协议格式——使用结束符的协议

分析协议格式

看一下这个图,这个协议有什么特点呢?

协议格式

它是由协议头部有效数据校验码协议尾部构成。
与上一篇文章中所给出的那个协议不太一样,它并没有在数据包内注明当前数据包的总长度到底是多长,而是通过一个“头部”和一个“尾部”来进行匹配,从中截取数据包的有效的内容。

示例数据

看两个示例,这里预设的协议头部是AA BB,协议尾部是EE FF。有效数据和校验位就在两者之间,看起来和上一篇文章中的协议格式有点相似,不同点在于数据包内部并没有用于注明长度的字节。
这种协议常用于明文字符串类型数据的通信,如AT指令等。


视频教程

【女朋友都能学会】C# 协议解包器(优雅处理粘包断包)

源代码

按照上方这个协议去实现与之匹配的解包器:

    /// <summary>
    /// 非固定长度的协议解包器
    /// 通过匹配特定的协议起始标记和结束标记来截取数据包
    /// </summary>
    public class SimpleData3Unpacker : Unpacker
    {
        private byte[] EndMark { get; } = new byte[] { 0xEE, 0xFF };

        public SimpleData3Unpacker()
        {
            StartMark = new byte[] { 0xAA, 0xBB };
        }

        protected override int CalculatePacketLength(IEnumerable<byte> bytes)
        {
            var index = bytes.IndexOf(EndMark);
            if (index < 0)
            {
                return 0;
            }
            else
            {
                return index + EndMark.Length;
            }
        }
    }

代码中在匹配协议尾部时使用了扩展方法IndexOf

var index = bytes.IndexOf(EndMark);

这是来自CodePuls扩展库的用于实现简单模式匹配(KMP算法)的扩展方法。通过NuGet即可安装,安装方法请参考文章:C# byte数组转十六进制字符串只需要一行代码

当然也可以手动实现简单的模式匹配算法来对协议尾部进行查找,KMP算法可以参考文章:C语言实现串的基本模式匹配


结束语

到此,BytesIO中协议解包器相关的基础部分已经完成了,在开发中遇到问题欢迎在评论区留言,也欢迎加入Q群中讨论。
此外项目的源代码我也会打包共享到群文件中,如有需要可以加群获取。
Q群:738018341


相关文章

C# 优雅处理通信中的粘包和断包(一) 处理固定长的的协议
C# 优雅处理通信中的粘包和断包(二) 处理非固定长度的协议
C# 优雅处理通信中的粘包和断包(三) 处理使用结束符的协议

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿长大人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值