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 魔法豆
每月119次下载
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。
非常感谢
- 向 https://github.com/jamesmunns 致谢,他提供了精彩的明信片格式,该格式被用作 Rust 绑定的灵感来源。
许可证
为了与其它模块兼容,此作品根据 APACHE 2.0 许可证提供,其副本包含在文件 LICENSE
中。
依赖项
~0.4–1MB
~23K SLoC