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 编码
2,375 每月下载量
用于 5 个crate(2个直接使用)
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
,则输出A0
为248
,A1
为(V-2032)/256
,以及A2
为(V-2032)%256
。 - 如果
V<=16_777_215
,则输出A0
为249
,以及A1 到
A3
作为小端 3 字节整数。 - 如果
V<=4_294_967_295
,则输出A0
为250
,以及A1 到
A4
作为小端 4 字节整数。 - 如果
V<=1_099_511_627_775
,则输出A0
为251
,以及A1 到
A5
作为小端 5 字节整数。 - 如果
V<=281_474_976_710_655
,则输出A0
为252
,以及A1 到
A6
作为小端 6 字节整数。 - 如果
V<=72_057_594_037_927_935
,则输出A0
为253
,以及A1 到
A7
作为小端 7 字节整数。 - 如果
V<=9_223_372_036_854_775_807
,则输出A0
为254
,以及A1 到
A8
作为小端 8 字节整数。 - 否则输出
A0
为255
,以及A1 到
A16
作为小端 16 字节整数。
有符号整数 Varint
首先转换为无符号整数 Varint
,然后编码为无符号整数。转换方法使得接近 0 的值占用更少的空间。有关详细信息,请参阅 Protobuf 文档。
依赖项
~170KB