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 编码
每月 77,374 次下载
用于 246 个 crate(75 直接使用)
195KB
4.5K SLoC
minicbor
适用于 no_std
环境的小型 CBOR 编解码器。
文档
文档可在以下网址获取:
许可证
本软件根据 Blue Oak Model License Version 1.0.0 许可。如果您有兴趣为此项目做出贡献,请首先阅读 CONTRIBUTING.md 文件。
lib.rs
:
适用于 no_std
环境的小型 CBOR 编解码器。
该包围绕以下实体组织:
编码和解码过程是类型驱动的,即通过调用预期数据项类型的方法来进行,例如 Decoder::u32
或 Encoder::str
。此外,还支持数据类型检查。可以查询 Decoder
的当前数据类型,它返回一个可以表示每个可能的 CBOR 类型的 data::Type
,因此可以根据此信息进行解码。还可以使用一个 Tokenizer
(即一个 Iterator
,遍历 CBOR Token
)来仅对输入字节进行标记化。最后,如果值类型实现了 CborLen
特性,则可以计算出值 CBOR 表示的字节长度。
可选地,可以使用相应的 derive 宏(需要 feature "derive"
)为结构体和枚举类型推导 Encode
和 Decode
。有关详细信息,请参阅 minicbor_derive
。
有关 I/O 支持,请参阅 minicbor-io
。
功能标志
支持以下功能标志
-
"alloc"
:在no_std
环境中启用大多数集合类型。 -
"std"
:隐含"alloc"
并启用更多依赖于std
crate 的功能。
示例:泛型编码和解码
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