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 编码

Download history 25/week @ 2024-04-22 13/week @ 2024-04-29 23/week @ 2024-05-06 20/week @ 2024-05-13 19/week @ 2024-05-20 9/week @ 2024-06-03 6/week @ 2024-06-10 1/week @ 2024-06-17 12/week @ 2024-06-24 56/week @ 2024-07-01 81/week @ 2024-07-08 50/week @ 2024-07-29 15/week @ 2024-08-05

71 每月下载量
2 crates 中使用

MIT/Apache

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