#byte #overhead #buffer #cobs #stuffing #encode-decode

无std cobs-rs

一个用于执行一致性开销字节填充的最小无std库

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

MIT 许可证

24KB
313

COBS-RS

GitHub docs.rs

COBS-RS是一个用Rust编写的非常简单的no_std Consistent Overhead Byte Stuffing(一致性开销字节填充)库。COBS算法以及这个crate提供的编码可以移除任意数据中的特定标记字节。这在传输以null字节终止的任意数据时非常有用,因此我们不想我们的任意数据缓冲区包含任何null字节。实际上,这个crate将自动在编码缓冲区的末尾附加标记字节。

请参阅文档

特性

cobs-rs crate只提供两个特定的函数。即stuffunstuff函数,分别用于编码和解码。这个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 许可证下授权。

无运行时依赖