5个版本 (破坏性更新)
0.7.0 | 2022年9月13日 |
---|---|
0.4.0 | 2022年7月29日 |
0.3.0 | 2022年4月10日 |
0.2.0 | 2022年4月2日 |
0.1.0 | 2022年3月31日 |
#144 在 #encode-decode
每月29次下载
用于 bin-layout
7KB
117 代码行
该库用于序列化和反序列化结构化数据
示例
[dependencies]
databuf = "0.5"
use databuf::{*, config::num::LE};
#[derive(Encode, Decode)]
struct Car<'a> {
year: u16,
is_new: bool,
name: &'a str,
}
#[derive(Encode, Decode)]
struct Company<'a> { name: String, cars: Vec<Car<'a>> }
let old = Company {
name: "Tesla".into(),
cars: vec![
Car { name: "Model S", year: 2018, is_new: true },
Car { name: "Model X", year: 2019, is_new: false },
],
};
let bytes = old.to_bytes::<LE>();
let new = Company::from_bytes::<LE>(&bytes).unwrap();
Vec
, String
, &[T]
, &str
等,首先编码它们的长度值,然后是每个条目。
默认情况下,集合的长度用BEU30
表示。
use databuf::{*, config::num::LE};
#[derive(Encode, Decode)]
struct Msg<'a> {
id: u16,
data: &'a str,
}
let bytes = [42, 0, 13, 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33];
// ^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Id Len Data
let msg = Msg::from_bytes::<LE>(&bytes).unwrap();
assert_eq!(msg.id, 42);
assert_eq!(msg.data, "Hello, World!"); // Here, data is referenced.
- 示例:将数据编码到指定大小的缓冲区中。
use databuf::{*, config::{num, len}};
/// Use big endian byte order + Encode `msg` length with `databuf::var_int::BEU15`
const CONFIG: u16 = num::BE | len::BEU15;
#[derive(Encode, Decode)]
struct Date {
year: u16,
month: u8,
day: u8,
}
#[derive(Encode, Decode)]
struct Record<T> {
id: T,
date: Date,
msg: String,
}
let record = Record { id: 42_u32, date: Date { year: 2018, month: 3, day: 7 }, msg: "Hello!".into() };
let mut buf = [0; 20];
let remaining = &mut buf.as_mut_slice();
record.encode::<CONFIG>(remaining).unwrap();
let amt = 20 - remaining.len();
assert_eq!(amt, 15); // 15 bytes written to `buf`
依赖
~1.5MB
~35K SLoC