#ton #tl-b #tlb #boc

tlbits

TL-B序列化(仅位)

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

Download history 426/week @ 2024-05-01 1103/week @ 2024-05-08 330/week @ 2024-05-15 237/week @ 2024-05-22 469/week @ 2024-05-29 330/week @ 2024-06-05 335/week @ 2024-06-12 161/week @ 2024-06-19 85/week @ 2024-06-26 419/week @ 2024-07-03 219/week @ 2024-07-10 122/week @ 2024-07-17 106/week @ 2024-07-24 62/week @ 2024-07-31 105/week @ 2024-08-07 69/week @ 2024-08-14

每月下载量391
4 个crate使用(通过 tlb

自定义许可

110KB
3K SLoC

二进制 TL-B de/serialization

docs.rs crates.io


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