#messagepack #codec #stdlib #no-std

no-std msgpackin_core

Msgpackin 纯 Rust MessagePack no_std 编码/解码库

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 中使用

Apache-2.0

71KB
2K SLoC

msgpackin_core

Msgpackin 纯 Rust MessagePack no_std 编码/解码库。

如果您正在寻找值类型或 serde 集成,请参阅主 msgpackin 包。

此包

  • 是用纯 Rust 编写的
  • 没有依赖项
  • 始终 #![no_std] - 没有启用 std 库的特性标志
  • 从不导入 alloc 包 - 没有导入的特性标志
  • 是无故障的 - 没有错误类型/Result 类型
    • 为使这一切成为可能所做的唯一妥协是,将 msgpack 的 "保留" 标记 (0xc1) 解码为 Nil 标记 (0xc0)

示例

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

无运行时依赖项