一致的开销字节填充 (COBS)
项目描述
- 联系方式:
- http://craig.mcqueen.id.au/
- 版权:
- 2010 克雷格·麦昆
用于编码和解码 COBS 的 Python 函数。
介绍
提供了cobs包,其中包含包含根据 COBS 方法进行编码和解码的功能的模块。
什么是 COBS?
COBS 是一种将字节包编码为不包含零值 (0x00) 字节的形式的方法。输入的字节包可以包含 0x00 到 0xFF 的全范围内的字节。保证 COBS 编码的数据包生成的数据包仅包含 0x01 到 0xFF 范围内的字节。因此,在通信协议中,可以用 0x00 字节可靠地界定数据包边界。
COBS 编码确实必须增加数据包大小才能实现这种编码。但是,与其他字节填充方法相比,数据包大小的增加是合理且可预测的。COBS 总是在消息长度上增加 1 个字节。此外,对于长度为n的较长数据包,它可能会向编码数据包大小添加 n/254(向下舍入)额外字节。
例如,与使用 0x7E 字节分隔 PPP 数据包的 PPP 协议相比。PPP 协议使用“转义”式的字节填充,将数据包中所有出现的 0x7E 字节替换为 0x7D 0x5E。但在最坏的情况下,这种字节填充方法可能会使数据包的大小翻倍。COBS 使用不同的字节填充方法,它具有更合理的最坏情况开销。
有关 COBS 的更多详细信息,请参阅参考资料[ 1 ] [ 2 ]。
我在 COBS 上包含了一个变体COBS/R,它稍微修改了 COBS 以经常避免 COBS 的 +1 字节开销。所以在许多情况下,特别是对于较小的数据包,COBS/R 编码数据包的大小与原始数据包的大小相同。有关COBS/R的更多详细信息,请参见下文。
参考
提供的模块
模块 |
简称 |
长名称 |
---|---|---|
玉米棒子 |
玉米棒 |
一致的开销字节填充(基本方法)[ 1 ] |
cobs.cobsr |
“ Consistent Overhead Byte Stuffing–Reduced ” ( COBS/R ) 是我自己的发明,是对基本 COBS 编码的修改,下面将更详细地描述。
以下内容未实施:
简称 |
长名称 |
---|---|
COBS/ZPE |
一致的开销字节填充 - 零对消除[ 1 ] |
COBS/ZRE |
一致的开销字节填充 - 零运行消除[ 2 ] |
提供了一个纯 Python 实现和一个 C 扩展实现。如果 C 扩展由于某种原因不可用,将使用纯 Python 版本。
用法
这些模块提供编码和解码功能。
输入应该是字节字符串,而不是 Unicode 字符串。基本用法:
>>> from cobs import cobs >>> encoded = cobs.encode(b'Hello world\x00This is a test') >>> encoded b'\x0cHello world\x0fThis is a test' >>> cobs.decode(encoded) b'Hello world\x00This is a test'
COBS/R用法几乎相同:
>>> from cobs import cobsr >>> encoded = cobsr.encode(b'Hello world\x00This is a test') >>> encoded b'\x0cHello worldtThis is a tes' >>> cobsr.decode(encoded) b'Hello world\x00This is a test'
任何实现缓冲区协议的类型,提供单个字节块,也可以作为输入:
>>> from cobs import cobs >>> encoded = cobs.encode(bytearray(b'Hello world\x00This is a test')) >>> encoded b'\x0cHello world\x0fThis is a test' >>> cobs.decode(encoded) b'Hello world\x00This is a test'
支持的 Python 版本
支持 Python >= 3.6,并且具有 C 扩展和纯 Python 实现。
Python 版本 < 3.6 可能有效,但尚未经过测试。
安装
cob 包是使用distutils安装的。如果您安装了构建 Python 扩展模块的工具,请运行以下命令:
python setup.py install
如果您无法构建 C 扩展,您可以使用以下命令仅安装纯 Python 实现:
python setup.py build_py install --skip-build
单元测试
基本单元测试在测试子模块中,例如cob.cobs.test。要运行它:
python -m cobs.cobs.test python -m cobs.cobsr.test
文档
文档是用 Sphinx 编写的。源文件在doc 目录中提供。它可以使用 Sphinx 0.6.5 构建。它使用pngmath Sphinx 扩展,需要安装 Latex 和dvipng。
该文档可在线获取:http ://packages.python.org/cobs/
执照
该代码是在 MIT 许可下发布的。有关详细信息,请参阅 LICENSE.txt。
一致的开销字节填充 - 减少 (COBS/R)
cobs.cobr模块中提供了对 COBS 的修改,我称之为“一致的开销字节填充减少”(COBS/R) 。它的目的是在某些情况下从编码形式中保存一个字节。普通 COBS 编码总是有 +1 字节的编码开销。有关详细信息,请参阅参考资料[ 1 ]。COBS/R 通常可以避免 +1 字节,如果它主要是被编码的小消息,这可能是一个有用的节省。
在普通 COBS 中,消息中的最后一个长度代码字节具有一些固有的冗余:如果它大于剩余字节数,则将其检测为错误。
在 COBS/R 中,每当最终数据字节的值大于或等于最终长度值通常的值时,我们机会主义地将最终长度代码字节替换为最终数据字节。这种变化可以被明确解码:解码器注意到长度代码大于剩余字节数。
例子
示例中的字节值是十六进制的。
第一个例子:
输入:
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 中,它用于在编码消息中保存一个字节。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
内置发行版
cob-1.2.0- cp310 -cp310-win32.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 991fc195f0581e456d3dd21e29df493fe9ca1b772084c26921601e48dbc34bd2 |
|
MD5 | c95b4589c42060c7886ddb9b859f2e89 |
|
布莱克2-256 | 13ff591f62ae9d0432f9bb735eeea4911ea280a706cd961e903660fc863793e6 |