python cobs协议编解码算法demo

1. Summary

COBS(Consistent Overhead Byte Stuffing)是一种算法,直译为一致的开销字节填充。简而言之,无论数据包的内容如何,都能通过产生高效可靠明确的数据包帧,从而使接受端能够从损坏的包中恢复。通常使用0x00来作为数据包的分隔符,即切割数据包的片分隔符。当使用0x00作为分隔符时,此算法会把每个零数据字节替换为非零值,这样数据包中就不会出现零数据字节,从而被误解为数据包分隔符。字节填充则是将可能包含"非法"或"保留"值,比如说数据包分隔符的数据字节序列,转换成不含这些值的序列的过程,当然可能会让这个序列变得更长,转换后的序列的额外长度通常被称为该算法的“开销”。关于开销有个例子,有个HDLC帧结构字节填充技术,大多数情况下开销很小,不到1%,但是最坏的情况下,数据包完全由需要转义的字节组成时,开销会达到100%。假设有一段数据需要通过HDLC帧结构传输,且该数据由一些特殊字节组成,这些字节需要进行转义处理:

  • 原始数据:

    7E 7D 7E
    
    • 这里,7E是HDLC帧的结束标志,7D是转义字符。
  • 经过HDLC字节填充后的数据:

    7D 5E 7D 5D 7D 5E
    
    • 7E被转义为7D 5E7D被转义为7D 5D,另一个7E再次转义为7D 5E

在这种情况下,原始数据的长度是3个字节,但经过HDLC字节填充后,长度变成了6个字节,数据大小翻倍,开销达到了100%。

那么,COBS算法严格限制了最坏开销的情况,COBS最少需要一个字节的开销,对于长度为N的数据包,需要最大的(n/254)字节开销。因此,传输编码字节序列的时间是高度可预测的,这使得COBS对于可能存在抖动问题的实时应用程序非常有效。算法计算成本也是不高的,除了最坏情况的开销外,与HDLC这种算法相比也是要更低的。但是在传输他的第一个字节前,他必须要知道接下来254个字节中的第一个0字节。

2. Packet Framing And Stuffing

当分组数据通过串行协议发送时,需要一些协议来划分数据包的边界。这是通过使用帧标记来完成的,这是一个特殊的位序列或字符值,指示数据包之间的边界在哪里。数据填充是指在传输前对数据包数据进行转换以消除所有出现的分帧标记的过程,这样当接收方检测到标记时,就可以确定该标记表示数据包之间的边界。COBS将[0,255]范围内的任意字节串转换为[1,255]范围内的字节串。消除了数据中的所有零字节后,现在可以使用零字节明确地标记转换后数据的结束。这是通过向转换后的数据附加一个零字节来实现的,从而形成一个由cobs编码的数据(有效负载)组成的数据包,以明确地标记数据包的末尾。(可以保留任何其他字节值作为数据包分隔符,但使用零可以简化描述。)

在这里插入图片描述

COBS编码过程:

1.添加首个byte,这个byte指的是下一个0的位置,那么从上图可以看出,第三个位置是0,所以首个byte是03

2.而当数据中有0时,需要被改写,改写的值就是距离下一个0的距离,0距离最后一个00差2,所以改写为02

3.每一个数据包的最后都要加上00

3. Example

Example Unencoded data (hex) Encoded with COBS (hex)
1 00 01 01 00
2 00 00 01 01 01 00
3 00 11 00 01 02 11 01 00
4 11 22 00 33 03
讲述机器人运动规划原理的经典书籍。 《规划算法》目录: 第Ⅰ部分 介绍性的资料  第1章 绪论   1.1 从规划(的过程)到规划(的结果)   1.2 实例与应用   1.3 规划的基本组成   1.4 算法、规划器与规划    1.4.1 算法    1.4.2 规划器    1.4.3 规划   1.5 本书的组织安排  第2章 离散规划   2.1 离散可行规划简介    2.1.1 问题表述    2.1.2 离散规划的实例    2.2 可行规划的搜索    2.2.1 一般前向搜索    2.2.2 特殊前向搜索    2.2.3 其他搜索方案    2.2.4 搜索方法的统一描述   2.3 离散最优规划    2.3.1 最优定长规划    2.3.2 不指定长度的最优规划    2.3.3 再论Dijkstra算法   2.4 用逻辑来表示离散规划    2.4.1 类似STRIPS的表示    2.4.2 转换到状态空间表示   2.5 基于逻辑的规划方法    2.5.1 部分规划空间中的搜索    2.5.2 建立规划图    2.5.3 满足性规划   进一步阅读   习题   实现 第Ⅱ部分 运动规划  第3章 几何表示与变换   3.1 几何建模    3.1.1 多边形与多面体模型    3.1.2 半代数模型    3.1.3 其他模型   3.2 刚体变换    3.2.1 一般概念    3.2.2 二维变换    3.2.3 三维变换   3.3 物体运动链的变换    3.3.1 二维运动链    3.3.2 三维运动链   3.4 运动树的变换   3.5 非刚体的变换   进一步阅读   习题   实现  第4章 位形空间   4.1 拓扑的基本概念    4.1.1 拓扑空间    4.1.2 流形    4.1.3 路径与连通   4.2 位形空间    4.2.1 二维刚体:SE(2)    4.2.2 三维刚体:SE(3)    4.2.3 物体的链与树   4.3 位形空间障碍物    4.3.1 基本运动规划问题    4.3.2 显式建模Cobs:加:平移情况    4.3.3 显式建模Cobs:一般情形   4.4 闭运动链    4.4.1 数学概念    4.4.2 R2上的运动链    4.4.3 定义一般连杆组的簇   进一步阅读   习题   实现  第5章 基于采样的运动规划  第6章 组合运动规划  第7章 基本运动规划的扩展  第8章 反馈运动规划 第Ⅲ部分 决策论规划  第9章 基本永生理论  第10章 序贯决策理论  第11章 传感器与信息空间  第12章 存在感测不确定性条件下的规则 第Ⅳ部分 微分约束条件下的规划   第13章 微分模型  第14章 微分约束条件下基于采样的规划  第15章 系统理论与分析技术
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值