5 个版本 (3 个破坏性更新)
0.4.0 | 2024年4月1日 |
---|---|
0.3.2 | 2023年12月22日 |
0.3.1 | 2022年8月18日 |
0.2.0 | 2022年8月16日 |
0.1.0 | 2022年4月26日 |
#81 in #cbor
每月下载量110次
在 3 个crate中使用(通过 cbored)
57KB
1K SLoC
cbored - 精确CBOR
cbored 是一个CBOR读取器和写入器,专注于精确的1-1 CBOR表示。
设计决策
此CBOR crate基于以下决策
- 尽可能接近CBOR类型
- 能够恢复给定编码CBOR类型的精确字节,特别是在非规范CBOR使用的情况下
- 隐藏给定CBOR类型中的不定/定选项,以保持使用简单
主要用例是处理不需要一个规范表示的CBOR数据流(标准CBOR规范或另一个),并且需要保持序列化数据的原样(例如,在加密设置中使用时)
注意
- 由于在我的用例中没有使用,有符号整数支持不是很好,因此有很多缺失的转换;欢迎贡献
自动CBOR编码和解码derive
可以在 Cargo.toml
中启用自动proc-macro derive
cbored = { version = "0.1", features = ["derive"] }
这允许为枚举和结构类型生成解码和解码实现
#[derive(CborRepr)]
#[cborrepr(structure = "array")]
// serialized as : ARRAY(2) [UINT, UINT]
pub struct Point {
x: u32,
y: u32,
}
#[derive(CborRepr)]
#[cborrepr(structure = "array_lastopt")]
// serialized as : ARRAY(2) [UINT, UINT]
// or : ARRAY(1) [UINT]
pub struct Point {
x: u32,
y: Option<u32>,
}
#[derive(CborRepr)]
#[cborrepr(structure = "flat")]
// serialized as : UINT, UINT
pub struct FlatPoint {
x: u32,
y: u32,
}
#[derive(CborRepr)]
#[cborrepr(structure = "mapint")]
// serialized as : MAP(2) { UINT(0) => UINT, UINT(1) => UINT }
// or : MAP(3) { UINT(0) => UINT, UINT(1) => UINT, UINT(2) => UINT }
pub struct FlatPoint {
#[cborrepr(mandatory)]
x: u32,
#[cborrepr(mandatory)]
y: u32,
z: Option<u32>
}
#[derive(CborRepr)]
#[cborrepr(enumtype = "tagvariant")]
// serialized as
// * One : ARRAY(2) [ UINT(0), UINT ]
// * Two : ARRAY(3) [ UINT(1), UINT, TEXT ]
// * Three : ARRAY(2) [ UINT(2), ARRAY(2) [ UINT, UINT ] ]
// * Four : ARRAY(1) [ UINT(3) ]
pub enum Variant {
One(u32),
Two(u64, String),
Three(Point),
Four,
}
#[derive(CborRepr)]
#[cborrepr(enumtype = "enumint")]
// serialized as
// * Code1 : UINT(0)
// * Code2 : UINT(1)
// * Code3 : UINT(2)
pub enum Code {
Code1,
Code2,
Code3,
}
#[derive(CborRepr)]
#[cborrepr(enumtype = "enumtype")]
// serialized as
// * Empty : NULL
// * One : UINT
pub enum OneOrEmpty {
#[cborrepr(cbortype = "null")]
Empty,
#[cborrepr(cbortype = "positive")]
One(u64),
}
结构
array
:结构序列化在长度反映元素数量的数组中一个接一个flat
:每个字段一个接一个序列化,使用每个类型的Decode/Encode实例。通常不推荐在一般情况下使用,因为它不与数组/映射结构很好地配合。mapint
:结构序列化为一个映射,其中键索引是字段相对于map_starts_at
参数的索引(如果不存在,则从0开始)
枚举
tagvariant
:带有一个表示变体的整数的数组,后面跟任何字段enumint
:只有一个整数的变体,没有内部元素。整数在变体之间顺序递增,并从0开始
依赖关系
~250–690KB
~16K SLoC