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
每月下载 147 次
用于 3 个 库(2 个直接使用)
205KB
4K SLoC
可变长度读取器
描述
基于 varint 格式读取可变长度数据的 Rust 包。
功能
- 读取和写入。
- 同步和异步实现。
- 支持 bytes 和 tokio 包。
- varint 实现的长块版本。(但不太推荐使用,因为它是愚蠢的。)
- 支持有符号和无符号值。(使用 zigzag 编码。)
- 直接支持 usize/isize 或从/to u128/i128 转换。(带有
ap
后缀。) - 支持额外的类型
f32
、f64
、vec<u8>
和string
。 - 内置了
std::io::Read
、std::io::Write
和tokio::io::AsyncRead
、tokio::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