Skip to main content

一致的开销字节填充 (COBS)

项目描述

作者

克雷格·麦昆

联系方式
http://craig.mcqueen.id.au/

用于编码和解码 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

COBS/R

一致的开销字节填充 - 减少

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 中,它用于在编码消息中保存一个字节。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

cobs-1.2.0.tar.gz (13.9 kB 查看哈希)

已上传 source

内置发行版

cobs-1.2.0-cp310-cp310-win_amd64.whl (25.7 kB 查看哈希

已上传 cp310

cob-1.2.0-cp310-cp310-win32.whl (24.3 kB 查看哈希

已上传 cp310

cobs-1.2.0-cp39-cp39-win_amd64.whl (25.7 kB 查看哈希

已上传 cp39

cob-1.2.0-cp39-cp39-win32.whl (24.3 kB 查看哈希

已上传 cp39

cob-1.2.0-cp38-cp38-win_amd64.whl (25.8 kB 查看哈希

已上传 cp38

cob-1.2.0-cp38-cp38-win32.whl (24.3 kB 查看哈希

已上传 cp38