4 个稳定版本
1.0.3 | 2023 年 3 月 22 日 |
---|
编码类库排名 #1011
每月下载量 332,436 次
在 lz4_net_legacy 中使用
22KB
306 行
bytes-varint
此 crate 扩展了 bytes
crate,支持整数值的可变长度序列化和反序列化(protobuf 风格)。
与 bytes
无缝集成
此 crate 与 bytes
crate 无关,但它通过提供对 bytes::Buf
/ bytes::BufMut
的泛型实现,实现了无缝集成。
导入 bytes_varint::*
,将 varint 函数可用在 Buf
/ BufMut
实例上
use bytes_varint::*;
fn put_numbers(buf: &mut impl BufMut, i: i16, j: u64) {
buf.put_i16_varint(i);
buf.put_u64_varint(j);
}
fn get_number(buf: &mut impl Buf) -> VarIntResult<u32> {
buf.get_u32_varint()
}
失败模式
可变长度解码可能会失败,调用者没有方法在解码前进行检查以确保成功。这不同于固定长度解码,如果解码 i32 时缓冲区至少有四个可用的字节,则固定长度解码保证成功。
有两种失败模式
- 数值溢出 - 编码在数字位数上没有内在的上限,因此解码的数字可能太大,无法适应给定的数字原始类型
- 缓冲区下溢 - 在解码数字之前,无法知道将要读取多少字节。因此,调用者无法提前进行检查,解码可能会失败。
算法
可变长度编码(详细信息请参见https://en.wikipedia.org/wiki/Variable-length_quantity,了解权衡)将数字存储在一系列字节中,使用每个字节的最少七个有效位存储实际数据,最高有效位指定是否还有更多字节要来。这允许小数字无论原始值的位数如何,都存储在一个字节中。
有符号整数是 'zig-zag' 编码(https://developers.google.com/protocol-buffers/docs/encoding#types),将 -64 到 63 的范围映射到单个字节。
依赖项
~170KB