3个不稳定版本
0.8.0 | 2021年12月8日 |
---|---|
0.7.3 | 2021年12月3日 |
0.7.0 | 2021年11月21日 |
#2217 in 编码
每月50次下载
用于 6 个crate(3 个直接使用)
50KB
1K SLoC
一个序列化器,序列化具有动态类型的值,并压缩整数、位和表示十进制的字符串。
即使变量的大小为8字节,当实际值为0或1时,此库也可以将其压缩为两个位。
这是Docchi文件系统的基础组件。
pub struct SomeCollection{
vec : Vec<SomeItem>
}
impl SomeCollection{
pub fn encode<W : std::io::Write>(&self, write : &mut W) -> Result<()>{
//KVal is the value type of this crate
let mut vec : Vec<docchi_compaction::KVal> = vec![];
//comp_int compresses integers considering actual size. 0,1 -> Bit. -128 to 127 -> Byte...
vec.push(comp_int(self.len() as i64));
for item in self.vec.iter(){
item.write(&mut vec);
}
//encode values to bytes
docchi_compaction::encode(&vec, write)?;
Ok(())
}
pub fn decode<R : std::io::Read>(read : &mut R) -> Result<Self>{
//decode to Vec<KVal>
let (kvals,_) = docchi_compaction::decode(read)?;
let mut iter = kvals.iter();
let len = iter.next()?.as_i64()? as usize;
let mut vec : Vec<SomeItem> = Vec::with_capacity(len);
for _ in 0..len{
vec.push(SomeItem::read(&mut iter)?)
}
Ok(SomeCollection{ vec })
}
}
pub struct SomeItem{
index : usize,
value : u8,
}
impl SomeItem{
pub fn write(&self, vec : &mut Vec<KVal>){
vec.push(comp_int(self.index as i64));
vec.push(comp_int(self.value as i64));
}
pub fn read<'a>(iter : &mut impl Iterator<Item=&'a KVal>) -> Result<SomeItem>{ //This Result implements From<NoneError>
let index = iter.next()?.as_i64()? as usize;
let value = iter.next()?.as_i64()? as u8;
Ok(SomeItem{ index, value })
}
}
变更日志
0.4.0
修改了值的编码“undefined”。
添加了Binary、Binary8、Binary4和Binary2类型。
依赖项
~2.4–3.5MB
~58K SLoC