#cbor #codec #data-encoding #binary #serialization #binary-data

无 std 程序+库 minicbor

适用于无 std 环境的小型 CBOR 编解码器

49 个版本 (23 个重大更新)

0.24.2 2024年6月28日
0.24.0 2024年4月17日
0.21.1 2024年3月28日
0.20.0 2023年9月24日
0.1.1 2020年3月29日

#64 in 编码

Download history 18014/week @ 2024-05-03 19077/week @ 2024-05-10 20037/week @ 2024-05-17 17906/week @ 2024-05-24 19477/week @ 2024-05-31 17361/week @ 2024-06-07 17605/week @ 2024-06-14 20010/week @ 2024-06-21 17772/week @ 2024-06-28 18210/week @ 2024-07-05 19507/week @ 2024-07-12 16257/week @ 2024-07-19 16151/week @ 2024-07-26 18751/week @ 2024-08-02 21275/week @ 2024-08-09 18586/week @ 2024-08-16

每月 77,374 次下载
用于 246 个 crate(75 直接使用)

BlueOak-1.0.0

195KB
4.5K SLoC

minicbor

适用于 no_std 环境的小型 CBOR 编解码器。

文档

文档可在以下网址获取:

许可证

本软件根据 Blue Oak Model License Version 1.0.0 许可。如果您有兴趣为此项目做出贡献,请首先阅读 CONTRIBUTING.md 文件。


lib.rs:

适用于 no_std 环境的小型 CBOR 编解码器。

该包围绕以下实体组织:

  • EncoderDecoder 用于值的有向编码和解码。

  • EncodeDecode 特性,可以用于实现任何应编码到或从 CBOR 解码的类型。它们类似于 serdeSerializeDeserialize 特性,但不抽象化编码器/解码器。

编码和解码过程是类型驱动的,即通过调用预期数据项类型的方法来进行,例如 Decoder::u32Encoder::str。此外,还支持数据类型检查。可以查询 Decoder 的当前数据类型,它返回一个可以表示每个可能的 CBOR 类型的 data::Type,因此可以根据此信息进行解码。还可以使用一个 Tokenizer(即一个 Iterator,遍历 CBOR Token)来仅对输入字节进行标记化。最后,如果值类型实现了 CborLen 特性,则可以计算出值 CBOR 表示的字节长度。

可选地,可以使用相应的 derive 宏(需要 feature "derive")为结构体和枚举类型推导 EncodeDecode。有关详细信息,请参阅 minicbor_derive

有关 I/O 支持,请参阅 minicbor-io

功能标志

支持以下功能标志

  • "alloc":在 no_std 环境中启用大多数集合类型。

  • "std":隐含 "alloc" 并启用更多依赖于 std crate 的功能。

  • "derive":允许推导 EncodeDecode 特性。

示例:泛型编码和解码

use minicbor::{Encode, Decode};

let input = ["hello", "world"];
let mut buffer = [0u8; 128];

minicbor::encode(&input, buffer.as_mut())?;
let output: [&str; 2] = minicbor::decode(buffer.as_ref())?;
assert_eq!(input, output);

示例:临时编码

use minicbor::Encoder;

let mut buffer = [0u8; 128];
let mut encoder = Encoder::new(&mut buffer[..]);

encoder.begin_map()? // using an indefinite map here
    .str("hello")?.str("world")?
    .str("submap")?.map(2)?
        .u8(1)?.bool(true)?
        .u8(2)?.bool(false)?
    .u16(34234)?.array(3)?.u8(1)?.u8(2)?.u8(3)?
    .bool(true)?.null()?
.end()?;

示例:临时解码

use minicbor::Decoder;
use minicbor::data::IanaTag;

let input = [
    0xc0, 0x74, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x30,
    0x33, 0x2d, 0x32, 0x31, 0x54, 0x32, 0x30, 0x3a,
    0x30, 0x34, 0x3a, 0x30, 0x30, 0x5a
];

let mut decoder = Decoder::new(&input);
assert_eq!(IanaTag::DateTime.tag(), decoder.tag()?);
assert_eq!("2013-03-21T20:04:00Z", decoder.str()?);

示例:标记化

use minicbor::display;
use minicbor::{Encoder, Decoder};
use minicbor::data::Token;

let input  = [0x83, 0x01, 0x9f, 0x02, 0x03, 0xff, 0x82, 0x04, 0x05];

assert_eq!("[1, [_ 2, 3], [4, 5]]", format!("{}", display(&input)));

let tokens = Decoder::new(&input).tokens().collect::<Result<Vec<Token>, _>>()?;

assert_eq! { &tokens[..],
    &[Token::Array(3),
      Token::U8(1),
      Token::BeginArray,
      Token::U8(2),
      Token::U8(3),
      Token::Break,
      Token::Array(2),
      Token::U8(4),
      Token::U8(5)]
};

let mut buffer = [0u8; 9];
Encoder::new(buffer.as_mut()).tokens(&tokens)?;

assert_eq!(input, buffer);

依赖关系

~170KB