14次发布

0.7.1 2024年2月12日
0.6.0 2019年3月21日
0.5.1 2018年9月14日
0.3.4 2018年3月30日
0.3.2 2017年7月29日

#571 in 编码

Download history 910/week @ 2024-04-14 914/week @ 2024-04-21 689/week @ 2024-04-28 343/week @ 2024-05-05 788/week @ 2024-05-12 402/week @ 2024-05-19 464/week @ 2024-05-26 607/week @ 2024-06-02 424/week @ 2024-06-09 484/week @ 2024-06-16 757/week @ 2024-06-23 1166/week @ 2024-06-30 659/week @ 2024-07-07 610/week @ 2024-07-14 512/week @ 2024-07-21 447/week @ 2024-07-28

2,375 每月下载量
用于 5 个crate(2个直接使用)

MIT 协议

30KB
860

查看 crate文档.


lib.rs:

可变长度有符号和无符号整数类型。类型支持128位整数,两者都编码为1-17字节。

编码规则基于SQLite 4 Varuint类型,并对支持128位长整数进行了修改。有符号整数使用Protobuf ZigZag方法进行编码,并重用无符号整数作为存储。

与Protobuf编码规则不同,Varint只需第一个字节即可找到整个值的长度。微基准测试表明,这要快得多。

如何使用

在Cargo.toml中添加依赖项

[dependencies]
varuint = "0.6"

将导入添加到您的代码中


use varuint::{Varint, Serializable, Deserializable};

使用它

use std::mem;
use std::io::Cursor;

use varuint::*;

fn main() {
    let mut cursor = Cursor::new(vec![]);
    let _ = cursor.write_varint(1u8).unwrap();
    let _ = cursor.write_varint(-300i16).unwrap();
    let v = Varint(-56_782i128);
    let _ = v.serialize(&mut cursor).unwrap();
    cursor.set_position(0);
    assert_eq!(1u8, ReadVarint::<u8>::read_varint(&mut cursor).unwrap());
    assert_eq!(-300i16, ReadVarint::<i16>::read_varint(&mut cursor).unwrap());
    assert_eq!(v, Varint::<i128>::deserialize(&mut cursor).unwrap());
}

编码规则

无符号整数Varint的编码规则如下(假设值为V

  • 如果V<<=240,则输出单个字节A0,等于V
  • 如果V<<=2031,则输出A0作为(V<-240)</tt>/</tt>256 </tt>+ </tt>241,并输出A1作为(V<-240)</tt>%</tt>256
  • 如果 V<=67567,则输出 A0248A1(V-2032)/256,以及 A2(V-2032)%256
  • 如果 V<=16_777_215,则输出 A0249,以及 A1A3 作为小端 3 字节整数。
  • 如果 V<=4_294_967_295,则输出 A0250,以及 A1A4 作为小端 4 字节整数。
  • 如果 V<=1_099_511_627_775,则输出 A0251,以及 A1A5 作为小端 5 字节整数。
  • 如果 V<=281_474_976_710_655,则输出 A0252,以及 A1A6 作为小端 6 字节整数。
  • 如果 V<=72_057_594_037_927_935,则输出 A0253,以及 A1A7 作为小端 7 字节整数。
  • 如果 V<=9_223_372_036_854_775_807,则输出 A0254,以及 A1A8 作为小端 8 字节整数。
  • 否则输出 A0255,以及 A1A16 作为小端 16 字节整数。

有符号整数 Varint 首先转换为无符号整数 Varint,然后编码为无符号整数。转换方法使得接近 0 的值占用更少的空间。有关详细信息,请参阅 Protobuf 文档

依赖项

~170KB