1个不稳定版本

0.1.0 2023年9月13日

#6 in #tokio-codec

Download history 55/week @ 2024-03-13 42/week @ 2024-03-20 26/week @ 2024-03-27 24/week @ 2024-04-03 1/week @ 2024-04-10 2/week @ 2024-04-17 70/week @ 2024-04-24 51/week @ 2024-05-01 14/week @ 2024-05-08 6/week @ 2024-05-15 3/week @ 2024-05-29 8/week @ 2024-06-05 6/week @ 2024-06-12 43/week @ 2024-06-19 123/week @ 2024-06-26

每月181次下载

MIT/Apache

56KB
1K SLoC

Cobs-Codec

Documentation Latest version Build Status unsafe forbidden

此crate提供用于Tokio的COBS(一致开销字节填充)编解码器。

COBS编码是一种非常高效的网络数据包封装方法。基本上;它允许你发送由任何字节组成的消息,同时仍然能够检测到消息的开始和结束。

编码的消息以一个特定的(可自定义的)字节结尾,称为哨兵。通过替换方案避免消息中此字节的出现,该方案添加的额外开销非常小:O(1 + N/254) 最坏情况。

选择哨兵值

此crate允许用户选择自己的哨兵值。选择值时有两个指导原则。

大小:当消息中每254个字节至少有一个哨兵时,编码的开销最小。请注意,对于长度不超过254个字节的短消息,此考虑因素不相关。

速度:编码/解码速度最快的是包含尽可能少的哨兵值的消息,理想情况下没有。

功能

  • 无不安全代码 (#[forbid))
  • 已测试

示例

use std::io::Cursor;
use tokio_util::codec::{FramedWrite, FramedRead};
use futures::{SinkExt, StreamExt};

use cobs_codec::{Encoder, Decoder};

// Choose a message separator that does not appear too frequently in your messages.
const SENTINEL: u8 = 0x00;

// It's a good idea to limit message size to prevent running out of memory.
const MAX: usize = 32;

let encoder = Encoder::<SENTINEL, MAX>::new();
let decoder = Decoder::<SENTINEL, MAX>::new();

// Imagine this buffer being sent from the server to the client.
let mut buffer = Vec::with_capacity(128);

let mut server_cursor = Cursor::new(&mut buffer);
let mut server = FramedWrite::new(&mut server_cursor, encoder);

// Send a few messages.
assert!(server.send("hello").await.is_ok());
assert!(server.send("world").await.is_ok());

let mut client_cursor = Cursor::new(&mut buffer);
let mut client = FramedRead::new(&mut client_cursor, decoder);

// Receive the messages.
assert_eq!(convert(&client.next().await), Some(Ok(b"hello".as_slice())));
assert_eq!(convert(&client.next().await), Some(Ok(b"world".as_slice())));
assert_eq!(convert(&client.next().await), None);

文档

文档

许可协议

许可协议为以下之一

任选其一。

贡献

除非您明确表示,否则您根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,都将根据上述方式双重许可,无需附加条款或条件。

依赖项

~2.7–4.5MB
~72K SLoC