17 个版本
0.4.0 | 2024年4月1日 |
---|---|
0.3.5 | 2023年11月4日 |
0.3.4 | 2023年8月18日 |
0.3.3 | 2022年8月26日 |
0.1.5 | 2022年3月31日 |
#295 in 编码
71 每月下载量
在 2 crates 中使用
135KB
3.5K 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"] }
这允许为枚举和结构类型生成 Decode 和 Encode 实现
#[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), ARRAY(2) [UINT, UINT] ]
// * Two : ARRAY(3) [ UINT(1), ARRAY(2) [UINT, UINT], ARRAY(2) [UINT, UINT] ]
pub enum Variant {
One(Point),
Two(Point, Point),
}
#[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 开始
依赖关系
~220KB