5 个版本
0.1.4 | 2024 年 6 月 23 日 |
---|---|
0.1.3 | 2024 年 6 月 21 日 |
0.1.2 | 2024 年 6 月 20 日 |
0.1.1 | 2024 年 6 月 20 日 |
0.1.0 | 2024 年 6 月 20 日 |
#836 在 编码
58KB
954 行
一致额外字节填充 (COBS)
Rust 用于编码和解码 COBS 的函数。
简介
此软件包提供 COBS 的编码和解码函数,以及 COBS 的一个微小变体 COBS/R。
什么是 COBS?
COBS 是一种将字节数据包编码成不包含值为零的字节的方法。输入的字节数据包可以包含从 0x00
到 0xFF
的所有字节。COBS 编码的数据包将保证生成仅包含从 0x01
到 0xFF
的字节的数据包。因此,在通信协议中,可以使用 0x00
字节可靠地分隔数据包边界。
为了实现这种编码,COBS 编码确实需要增加数据包大小。然而,与其他字节填充方法相比,数据包大小的增加是合理且可预测的。COBS 总是向消息长度添加 1 个字节。此外,对于长度为 n 的较长的数据包,它 可能 还会增加 n/254(向下取整)个额外的字节到编码后的数据包大小。
例如,与使用 0x7E
字节来分隔 PPP 数据包的 PPP 协议相比。PPP 协议使用一种“转义”风格的字节填充,将数据包中所有 0x7E
字节的实例替换为 0x7D 0x5E
。但是,在最坏的情况下,这种字节填充方法可能会使数据包大小加倍。COBS 使用一种不同的字节填充方法,其最坏情况开销更加合理。
有关 COBS 的更多详细信息,请参阅参考文献。
我包括了 COBS 的一个变体,即 COBS/R,它略微修改了 COBS 以经常避免 COBS 的 +1 字节开销。因此,在许多情况下,特别是对于较小的数据包,COBS/R 编码的数据包大小与原始数据包大小相同。有关 COBS/R 的更多详细信息,请参阅下面。
参考文献
一致额外字节填充
Stuart Cheshire 和 Mary Baker
IEEE/ACM 传输,第 7 卷,第 2 期,1999 年 4 月
一致的额外字节填充(针对 IEEE)
http://www.stuartcheshire.org/papers/COBSforToN.pdf
PPP 一致额外字节填充(COBS)
PPP 工作组互联网草案
James Carlson,IronBridge 网络
Stuart Cheshire 和 Mary Baker,斯坦福大学
1997 年 11 月
PPP 一致额外字节填充(COBS)
http://tools.ietf.org/html/draft-ietf-pppext-cobs-00
提供的模块
cobs2::cobs
— 一致的额外字节填充(基本方法)cobs2::cobsr
— COBS/R — 一致的额外字节填充—减少
"一致的额外字节填充—减少"(COBS/R)是我自己的发明,是基本 COBS 编码的修改,下面将详细介绍。
以下没有实现
- COBS/ZPE — 一致的额外字节填充—零对消除
- COBS/ZRE — 一致的额外字节填充—零运行消除
用法
模块提供编码和解码的功能。提供几种实现,它们在输入和输出数据类型上有所不同。
- 数组(no_std)
encode_array()
decode_array()
- 向量
encode_vector()
decode_vector()
- 迭代器
encode_iter()
decode_iter()
encode_ref_iter()
decode_ref_iter()
单元测试
已实现单元测试
cargo test
许可证
代码在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE.txt。
一致的额外字节填充—减少(COBS/R)
我将其称为“一致的额外字节填充—减少”(COBS/R)的 COBS 修改,提供在 cobs2::cobsr
模块中。其目的是在某些情况下从编码形式中节省一个字节。普通的 COBS 编码始终有一个 +1 字节编码开销。有关详细信息,请参阅参考资料。COBS/R 可以经常避免 +1 字节,如果主要是小消息被编码,这可能是有用的节省。
在普通的 COBS 中,消息中的最后一个长度代码字节有一些固有的冗余:如果它大于剩余的字节数,则将其检测为错误。
在 COBS/R 中,我们 opportunistic 地将最终长度代码字节替换为最终数据字节,只要最终数据字节的值大于或等于最终长度值通常应有的值。这种变化可以明确解码:解码器注意到长度代码大于剩余字节数。
示例
示例中的字节值是十六进制的。
第一个示例
输入
2F A2 00 92 73 02
此示例在 COBS 和 COBS/R 中编码相同。编码(长度代码字节已突出显示)
03 2F A2 04 92 73 02
第二个示例
第二个示例几乎相同,只是最终数据字节的值大于长度字节。
输入
2F A2 00 92 73 26
在普通 COBS 中编码(长度代码字节已突出显示)
03 2F A2 04 92 73 26
在 COBS/R 中编码
03 2F A2 26 92 73
因为最后一个数据字节(26
)大于通常的长度代码(04
),最后一个数据字节可以插入长度代码的位置,并从序列的末尾删除。这避免了 COBS 编码通常 +1 字节的额外开销。
解码器通过检测长度代码是否大于剩余字节数来检测编码中的这种变化。在常规 COBS 中,这种情况将是一个解码错误,但在 COBS/R 中,它用于在编码消息中节省一个字节。