1 个不稳定版本
0.2.0 | 2024年7月24日 |
---|---|
0.1.0 |
|
#1415 in 解析器实现
135 每月下载量
230KB
5K SLoC
Ender
Ender是一个Rust编码和解码库,用于编写自定义协议和文件格式。
它旨在做到 直观、可扩展 和 正确。
示例
let mut the_matrix = vec![0u8; 256];
// Summon John into existence!
let john = Person {
name: String::from("John"),
age: 35,
height: 1.75,
eye_color: EyeColor::Brown
};
// Encode John into the matrix
encode_with(SliceMut::new(&mut the_matrix), Context::default(), &john)?;
// Bring him back
let john_2: Person = decode_with(Slice::new(&the_matrix), Context::default())?;
// But is he really the same John?
assert_eq!(john, john_2);
编码格式
编码过程旨在做到 正确 和 不出所料。
ender支持一系列选项,可以在编码/解码过程中更改,以精确表示二进制格式的某些部分。
这可以通过手动实现以及使用提供的自定义属性,通过 derive 宏来完成。
某些类型还支持 "扁平化",这意味着省略已知上下文中的信息。例如,如果该信息已存储在文件格式中的其他位置,则可以省略是否写入 Option
的信息。
对于 整数原语、usize 和 枚举变体,您可以自定义字节序、数值编码(即 var-ints)、位宽(在编码格式中,usize
或枚举变体占用多少字节?)以及最大大小(以防止恶意构建的二进制格式导致无限大小的分配)。
Var-int格式
- 固定 - 不是 var-int,直接按原样编码数字
- Leb128
- Protobuf - 其 zigzag 和 "浪费" 变体
字符串格式
对于字符串,目前支持长度前缀、null-终止(带和不带最大长度)字符串,以及以下编码格式。
- Ascii
- Utf8
- Utf16
- Utf32
- Windows1252
如果您需要添加新的 var-int 编码或字符串编码,请随时提交PR!
动机
我创建这个库的主要原因是发现自己需要更多复杂的宏和运行时灵活性来处理现有的二进制格式。
虽然例如 bincode
对于许多应用来说已经足够好,但ender是考虑到与现有数据格式的兼容性而创建的。
为此目的,编码器的许多内部细节都通过设置或 derive 宏本身公开,以便您可以精确调整数据格式,同时提供一个易于理解的接口。
派生
ender
的一个大卖点是其宏功能,它允许您通过一系列属性来高度自定义代码生成。要了解更多信息,请查看此crate根目录中的DERIVE.md
。
MSRV
此crate将始终针对最新版本的rust,以便在发布新功能时能够及时访问,并在有益的情况下相应地更新代码。当然,破坏性API更改将伴随主要版本号的增加。
未来计划
我计划通过特性门支持async
io。
依赖项
~2.6–4MB
~75K SLoC