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编码

Download history 799/week @ 2024-04-22 311/week @ 2024-04-29 484/week @ 2024-05-06 587/week @ 2024-05-13 505/week @ 2024-05-20 557/week @ 2024-05-27 637/week @ 2024-06-03 589/week @ 2024-06-10 482/week @ 2024-06-17 481/week @ 2024-06-24 585/week @ 2024-07-01 925/week @ 2024-07-08 334/week @ 2024-07-15 365/week @ 2024-07-22 283/week @ 2024-07-29 180/week @ 2024-08-05

1,194 每月下载次数
4 包中使用(直接使用 3 个)

MIT 协议

32KB
652

ed (编码/解码)

一个用于Rust中确定性二进制编码的最小化包。

CI codecov Crate API

概述

此包提供 EncodeDecode 特质,可以用于任何可以转换为或从字节转换的类型,并实现了这些特质的许多内置Rust类型。它还提供了推导宏,以便可以轻松地为结构体推导 EncodeDecode

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