#async-io #tokio #varint #io #data-encoding #async #io-read

无 std variable-len-reader

一个用于读取/写入可变长度数据的库。支持 tokio 中的 AsyncRead/AsyncWrite。

13 个版本 (稳定)

3.2.0 2024 年 3 月 20 日
2.4.0 2024 年 2 月 26 日
1.0.0 2023 年 12 月 20 日
0.5.1 2023 年 12 月 20 日

#8#varint

Download history 10/week @ 2024-04-22 8/week @ 2024-05-20 13/week @ 2024-05-27 14/week @ 2024-06-03 11/week @ 2024-06-10 11/week @ 2024-06-24 24/week @ 2024-07-01 15/week @ 2024-07-15 124/week @ 2024-07-29 8/week @ 2024-08-05

每月下载 147
用于 3 库(2 个直接使用)

MIT 许可证

205KB
4K SLoC

可变长度读取器

Crate GitHub last commit GitHub issues GitHub pull requests GitHub

用其他语言阅读: 英文简体中文.

描述

基于 varint 格式读取可变长度数据的 Rust 包。

功能

  • 读取和写入。
  • 同步和异步实现。
  • 支持 bytestokio 包。
  • varint 实现的长块版本。(但不太推荐使用,因为它是愚蠢的。)
  • 支持有符号和无符号值。(使用 zigzag 编码。)
  • 直接支持 usize/isize 或从/to u128/i128 转换。(带有 ap 后缀。)
  • 支持额外的类型 f32f64vec<u8>string
  • 内置了 std::io::Readstd::io::Writetokio::io::AsyncReadtokio::io::AsyncWrite 实现。
  • 支持 bytes::Buf 链接。
  • 支持无 std。

用法

将此添加到您的 Cargo.toml

[dependencies]
variable-len-reader = "^3.2"

示例

直接用于 tcp 流

use std::net::{TcpListener, TcpStream};
use anyhow::Result;
use variable_len_reader::{VariableReader, VariableWriter};

fn main() -> Result<()> {
    let server = TcpListener::bind("localhost:0")?;
    let mut client = TcpStream::connect(server.local_addr()?)?;
    let mut server = server.incoming().next().unwrap()?;

    // Write
    client.write_string(&"Hello world!")?;

    // Read
    let message = server.read_string()?;
    assert_eq!("Hello world!", message);
    
    Ok(())
}

bytes 包一起使用

use bytes::{Buf, BufMut, BytesMut};
use variable_len_reader::{VariableReader, VariableWriter};

fn main() {
    let message = "Hello world!";
    let mut writer = BytesMut::new().writer();

    // Write
    writer.write_string(message).unwrap();

    let bytes = writer.into_inner();
    assert_eq!(message.len() as u8, bytes[0]);
    assert_eq!(message.as_bytes(), &bytes[1..]);
    let mut reader = bytes.reader();

    // Read
    let string = reader.read_string().unwrap();
    assert_eq!(message, string);
}

使用 tokio 包的异步模式:(需要 'async_default' 功能)

use anyhow::Result;
use tokio::net::{TcpListener, TcpStream};
use variable_len_reader::{AsyncVariableReader, AsyncVariableWriter};
use variable_len_reader::helper::{AsyncReaderHelper, AsyncWriterHelper};

#[tokio::main]
async fn main() -> Result<()> {
    let server = TcpListener::bind("localhost:0").await?;
    let mut client = TcpStream::connect(server.local_addr()?).await?;
    let (mut server, _) = server.accept().await?;

    // Write
    AsyncWriterHelper(&mut client).help_write_string(&"Hello tokio!").await?;

    // Read
    let message = AsyncReaderHelper(&mut server).help_read_string().await?;
    assert_eq!("Hello tokio!", message);
    
    Ok(())
}

依赖项

~0.1–3.5MB
~62K SLoC