24个版本
新版本 0.3.0 | 2024年8月21日 |
---|---|
0.2.22 | 2024年6月16日 |
0.2.19 | 2024年5月28日 |
0.2.2 | 2024年4月25日 |
0.1.1 | 2024年4月24日 |
在 编码 类别中排名第803
每月下载量391次
被 4 个crate使用(通过 tlb)
110KB
3K SLoC
二进制 TL-B de/serialization
lib.rs
:
示例
考虑以下TL-B模式
tag$10 query_id:uint64 amount:(VarUInteger 16) = Hello;
首先定义一个包含这些参数的struct Hello
struct Hello {
pub query_id: u64,
pub amount: BigUint,
}
序列化
为了能够将类型序列化为BitWriter
,我们应该在它上面实现BitPack
#
impl BitPack for Hello {
fn pack<W>(&self, mut writer: W) -> Result<(), W::Error>
where W: BitWriter,
{
writer
// tag$10
.pack_as::<_, NBits<2>>(0b10)?
// query_id:uint64
.pack(self.query_id)?
// amount:(VarUInteger 16)
.pack_as::<_, &VarInt<4>>(&self.amount)?;
Ok(())
}
}
writer.pack(Hello {
query_id: 0,
amount: 1_000u64.into(),
})?;
反序列化
为了能够将类型从BitReader
反序列化,我们应该在它上面实现BitUnpack
impl BitUnpack for Hello {
fn unpack<R>(mut reader: R) -> Result<Self, R::Error>
where R: BitReader,
{
// tag$10
let tag: u8 = reader.unpack_as::<_, NBits<2>>()?;
if tag != 0b10 {
return Err(Error::custom(format!("unknown tag: {tag:#b}")));
}
Ok(Self {
// query_id:uint64
query_id: reader.unpack()?,
// amount:(VarUInteger 16)
amount: reader.unpack_as::<_, VarInt<4>>()?,
})
}
}
let hello: Hello = parser.unpack()?;
依赖项
~2.5MB
~55K SLoC