5个稳定版本
1.1.2 | 2022年7月29日 |
---|---|
1.1.1 | 2021年3月25日 |
1.1.0 | 2021年3月17日 |
1.0.1 | 2021年3月11日 |
#393 in 嵌入式开发
用于 corncobs
24KB
313 行
COBS-RS
COBS-RS是一个用Rust编写的非常简单的no_std Consistent Overhead Byte Stuffing(一致性开销字节填充)库。COBS算法以及这个crate提供的编码可以移除任意数据中的特定标记字节。这在传输以null字节终止的任意数据时非常有用,因此我们不想我们的任意数据缓冲区包含任何null字节。实际上,这个crate将自动在编码缓冲区的末尾附加标记字节。
请参阅文档。
特性
cobs-rs crate只提供两个特定的函数。即stuff
和unstuff
函数,分别用于编码和解码。这个crate不使用std
,这使得它非常适合嵌入式硬件。然而,它也可以用于嵌入式系统之外。
使用方法
编码(stuff
)和解码(unstuff
)函数都使用了const generics。对于不熟悉这个特性的用户来说,这可能会使得使用起来有点反直觉。
这里需要注意的是,与输入缓冲区相比,COBS算法最多会添加2 + (输入缓冲区大小 / 256)
(整数除法)字节到编码缓冲区的大小。这个事实允许我们始终为输出缓冲区保留足够的空间。
编码缓冲区
让我们看看如何使用 stuff
函数对一些数据进行编码的一个小例子。
let data: [u8; 254] = [
// ...snip
];
// Our input buffer is 254 bytes long.
// Thus, we need to reserve 2 + (254 / 256) = 2 extra bytes
// for the encoded buffer.
let encoded: [u8; 256] = cobs_rs::stuff(data, 0x00);
// We can also encode much larger buffers
let a_lot_of_data: [u8; 1337] = [
// ...snip
];
// Our input buffer is 1337 bytes long.
// Thus, we need to reserve 2 + (1337 / 256) = 7 extra bytes
// for the encoded buffer.
let a_lot_of_output: [u8; 1344] = cobs_rs::stuff(a_lot_of_data, 0x00);
注意: 输出缓冲区类型规范总是必要的。大多数情况下,输入数据的类型规范不是必要的。
解码缓冲区
现在,让我们看看如何使用 unstuff
函数解码数据。
通常,为解码缓冲区保留 编码缓冲区大小 - 2
字节是一个好主意。按照这个规则,我们总是会有足够的编码缓冲区空间。在解码缓冲区旁边,unstuff
函数也会返回缓冲区的实际填充大小。
// We are given some encoded data buffer
let encoded_data: [u8; 256] = [
//... snip
];
// We reserve 256 - 2 = 254 bytes for the decoded buffer.
let (decoded_data: [u8; 254], decoded_data_length) =
cobs_rs::unstuff(encoded_data, 0x00);
// We can also decode bigger buffers
let a_lot_of_encoded_data: [u8; 1344] = [
//... snip
];
// We reserve 1344 - 2 = 1342 bytes for the decoded buffer.
let (a_lot_of_decoded_data: [u8; 1342], a_lot_of_decoded_data_length) =
cobs_rs::unstuff(encoded_data, 0x00);
注意: 解码缓冲区类型规范总是必要的。大多数情况下,编码数据的类型规范不是必要的。
许可证
在 MIT 许可证下授权。