11个版本
0.3.0 | 2022年2月16日 |
---|---|
0.2.2 | 2021年9月4日 |
0.2.1 | 2021年8月31日 |
0.1.6 | 2021年3月15日 |
0.1.2 | 2020年7月26日 |
#2115 在 编码 中
1,194 每月下载次数
在 4 个 包中使用(直接使用 3 个)
32KB
652 行
ed (编码/解码)
一个用于Rust中确定性二进制编码的最小化包。
概述
此包提供 Encode
和 Decode
特质,可以用于任何可以转换为或从字节转换的类型,并实现了这些特质的许多内置Rust类型。它还提供了推导宏,以便可以轻松地为结构体推导 Encode
和 Decode
。
ed
比比 serde
更简单,因为它不试图创建一个允许任意类型编码(JSON、MessagePack等)的抽象,而是专注于二进制编码。它也比主要的二进制序列化程序 bincode
要快得多。
ed
的一个目标是强迫顶级类型作者设计自己的编码,而不是尝试提供一种通用的编码方案。这使得 ed
的用户可以确信他们的编码尽可能高效,并且更容易在其他语言或库中理解编码(与 bincode
等相比,后者如果不了解 bincode
的内部机制,就无法明显了解类型的编码方式)。
此包的另一个特性是关注确定性(对于加密散列类型很重要) - 内置编码始终是大端字节序,并且没有为浮点数或 usize
提供编码。
使用方法
use ed::{Encode, Decode};
// traits are implemented for built-in types
let bytes = 123u32.encode()?; // `bytes` is a Vec<u8>
let n = u32::decode(bytes.as_slice())?; // `n` is a u32
// derive macros are available
#[derive(Encode, Decode)]
struct Foo {
bar: (u32, u32),
baz: Vec<u8>
}
// encoding and decoding can be done in-place to reduce allocations
let mut bytes = vec![0xba; 40];
let mut foo = Foo {
bar: (0, 0),
baz: Vec::with_capacity(32)
};
// in-place decode, re-using pre-allocated `foo.baz` vec
foo.decode_into(bytes.as_slice())?;
assert_eq!(foo, Foo {
bar: (0xbabababa, 0xbabababa),
baz: vec![0xba; 32]
});
// in-place encode, into pre-allocated `bytes` vec
bytes.clear();
foo.encode_into(&mut bytes)?;
依赖项
~1.5MB
~36K SLoC