4 个版本
0.0.4 | 2023年8月31日 |
---|---|
0.0.3 | 2022年2月15日 |
0.0.2 | 2022年2月9日 |
0.0.1 | 2022年2月2日 |
#2245 在 编码
30 每月下载量
在 msgpackin 中使用
71KB
2K SLoC
msgpackin_core
Msgpackin 纯 Rust MessagePack no_std
编码/解码库。
如果您正在寻找值类型或 serde 集成,请参阅主 msgpackin 包。
此包
- 是用纯 Rust 编写的
- 没有依赖项
- 始终
#![no_std] - 没有启用 std 库的特性标志
- 从不导入
alloc
包 - 没有导入的特性标志 - 是无故障的 - 没有错误类型/Result 类型
- 为使这一切成为可能所做的唯一妥协是,将 msgpack 的 "保留" 标记 (
0xc1
) 解码为Nil
标记 (0xc0
)
- 为使这一切成为可能所做的唯一妥协是,将 msgpack 的 "保留" 标记 (
示例
use msgpackin_core::encode::*;
use msgpackin_core::decode::*;
const S1: &str = "hello ";
const S2: &str = "world!";
// this is a no_std, no alloc crate, everything must be on the stack
let mut buf: [u8; 15] = [0; 15];
let mut cur = 0;
{
// small helper closure to write consecutive data to our buffer
let mut write = |data: &[u8]| {
buf[cur..cur + data.len()].copy_from_slice(data);
cur += data.len();
};
// construct a new encoder
let mut enc = Encoder::new();
// write the bytes marking an array msgpack type of length 2
write(&enc.enc_arr_len(2));
// write the length of the string we are trying to encode
write(&enc.enc_str_len(S1.as_bytes().len() as u32));
// write the actual string bytes
write(S1.as_bytes());
// write the second string length
write(&enc.enc_str_len(S2.as_bytes().len() as u32));
// write the second string bytes
write(S2.as_bytes());
}
// make sure we wrote the correct bytes to the buffer
assert_eq!(
&[
146, 166, 104, 101, 108, 108, 111, 32, 166, 119, 111, 114, 108,
100, 33
],
&buf[..]
);
let mut dec = Decoder::new();
let mut iter = dec.parse(&buf);
assert_eq!(Some(Token::Len(LenType::Arr, 2)), iter.next());
assert_eq!(Some(Token::Len(LenType::Str, 6)), iter.next());
assert_eq!(Some(Token::Bin(S1.as_bytes())), iter.next());
assert_eq!(Some(Token::Len(LenType::Str, 6)), iter.next());
assert_eq!(Some(Token::Bin(S2.as_bytes())), iter.next());
assert_eq!(None, iter.next());
许可证:Apache-2.0