#binary-format #bindings #protocols #serialization #smart #array #bipack

bipack_ru

在Divan智能合约、wasm绑定、网络协议等中使用的二进制尺寸高效的格式

10个不稳定版本 (3个破坏性)

0.4.4 2023年12月16日
0.4.3 2023年12月5日
0.4.1 2023年11月28日
0.3.3 2023年11月27日
0.1.0 2023年10月10日

#1606 in 魔法豆

Download history • Rust 包仓库 31/week @ 2024-04-01 • Rust 包仓库

每月119次下载

Apache-2.0

70KB
1.5K SLoC

bipack_ru: Rust Bipack实现

Bipack序列化格式是一种紧凑的二进制格式,它被创建为BOSS格式的替代品,更紧凑,更快,并且尽可能地不泄露内部数据结构。它用于我们下一代数据保护系统,在DiWAN产品中作为基本格式,还用于我的新通信包,如kiloparsec(以及底层的crypto2),旨在取代较旧的Parsec协议系列,以应对现代疯狂世界挑战。

重要 由于世界紧张局势的加剧,主要开发已转移到我们的 Gitea仓库。我们将尽力使其在全球范围内可用。

最新的代码将在这里,我们鼓励大家将其用于问题/讨论。

beta测试

与serde一起使用

使用bipack_ru:ser:to_bytes()bipack_ru:de:from_bytes()函数

fn test() -> Result<(),Error> {
    let src = HashSet::from(["foo", "bar", "buz"].map(|i| i.to_string()));
    let packed = to_bytes(&src)?;
    println!("{}", to_dump(&packed));

    let restored: HashSet<String> = from_bytes(&packed)?;
    println!("{:?}", restored);
    assert_eq!(src, restored);
}

serde模块支持所有Rust格式,除了尚未被bipack格式使用和标准化的浮点数/双精度数。

  • 所有整数,有符号和无符号的,都使用可变长度的smartint进行编码。

可以使用自定义的编/解码器进行固定大小编码(与postcard格式完全相同)

#[derive(Serialize)]
pub struct DefinitelyBigEndian {
    #[serde(with = "bipack_ru::fixint::be")]
    // or #[serde(with = "bipack_ru::fixint::le")]
    x: u16,
}

固定或可变长度数组?

编码数组时,规则很简单

  • 动态数组(数组、向量等)以大小编码,作为可变长度
  • 固定大小的数组,例如元组 (1,2,3,4,5),或者类似 [u32; 5] 的结构,都被编码为固定大小的实体。

直接使用(无 serde)

示例代码(更多内容请参阅 src/lib.rs:)

fn test() {
    let mut data = Vec::<u8>::new();
    data.put_str("Hello, rupack!");
    println!("size ${}\n{}", data.len(), to_dump(&data));
    let mut src = SliceSource::from(&data);
    assert_eq!("Hello, rupack!", src.get_str().unwrap());
}

工具和宏

  • to_dump 将二进制切片转换为人类可读的转储
  • StringBuilder 超最小化字符串构建器(占用空间)。

自动文档文档已经足够好,所以我们现在不再重复。

如何

  • 只需将此包添加到您的依赖项中,它位于 crates.io。

非常感谢

许可证

为了与其它模块兼容,此作品根据 APACHE 2.0 许可证提供,其副本包含在文件 LICENSE 中。

依赖项

~0.4–1MB
~23K SLoC