#byte #varint #protobuf #integer-value

bytes-varint

bytes crate 提供可变长度整数编码(protobuf 风格)

4 个稳定版本

1.0.3 2023 年 3 月 22 日

编码类库排名 #1011

Download history 42369/week @ 2024-03-14 43168/week @ 2024-03-21 53200/week @ 2024-03-28 50842/week @ 2024-04-04 60296/week @ 2024-04-11 58745/week @ 2024-04-18 56350/week @ 2024-04-25 61947/week @ 2024-05-02 66580/week @ 2024-05-09 68243/week @ 2024-05-16 72258/week @ 2024-05-23 83971/week @ 2024-05-30 84928/week @ 2024-06-06 78459/week @ 2024-06-13 69665/week @ 2024-06-20 77805/week @ 2024-06-27

每月下载量 332,436
lz4_net_legacy 中使用

MIT 许可证

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