31 个版本 (稳定)
1.0.24 | 2024年1月4日 |
---|---|
1.0.23 | 2023年11月24日 |
1.0.22 | 2023年10月26日 |
1.0.13 | 2023年9月30日 |
0.1.0 | 2023年6月17日 |
#714 in 编码
每月662次下载
在 elflib 中使用
49KB
858 行
binary_serde
这是一个允许将 Rust 结构体序列化和反序列化到紧凑二进制格式的 crate。
该格式正好按照您期望的方式执行,它只是按照它们在内存中的表示顺序序列化所有字段,并按照选择的字节序。
这对于解析许多常见的二进制格式非常有用,这些格式通常只是以紧凑的二进制表示形式表示字段,就像这个 crate 使用的格式一样。
此外,这个 crate 非常 no_std
友好,并允许编写高性能的代码,因为它允许在编译时知道类型的序列化大小,这意味着类型可以被序列化到一个在编译时已知大小的栈缓冲区中,无需堆分配。
请注意,这意味着像 &[T]
、Vec<T>
和 String
这样的动态大小类型不受支持。
位字段
此 crate 还支持定义位字段,因为位字段在许多二进制格式中似乎很常见。位字段定义允许用户指定结构体中每个字段的位长度。位字段使用 binary_serde_bitfield
属性定义。位字段中字段的顺序被视为最低有效位优先。下面是一个位字段的示例。
std 支持
此 crate 提供了一个名为 std
的功能标志,该标志启用了一组与 std 相关的功能。
- 错误类型实现了
std::error::Error
- 向
BinarySerde
特质中添加了binary_serialize_into
和binary_deserialize_from
函数,这些函数允许将数据序列化/反序列化为数据流(std::io::Read
/std::io::Write
)。 - 添加了一些需要
std
支持的便利函数和结构体。
示例
一个序列化和反序列化 elf 32 位重定位条目的简单示例
use binary_serde::{binary_serde_bitfield, BinarySerde, Endianness};
#[derive(Debug, BinarySerde, Default, PartialEq, Eq)]
#[repr(u8)]
enum Elf32RelocationType {
#[default]
Direct = 1,
PcRelative = 2,
GotEntry = 3,
// ...
}
#[derive(Debug, Default, PartialEq, Eq)]
#[binary_serde_bitfield(order = BitfieldBitOrder::LsbFirst)]
struct Elf32RelocationInfo {
#[bits(8)]
ty: Elf32RelocationType,
#[bits(24)]
symbol_index: u32,
}
#[derive(Debug, BinarySerde, Default, PartialEq, Eq)]
struct Elf32RelocationWithAddend {
offset: u32,
info: Elf32RelocationInfo,
addend: u32,
}
fn main() {
let rel = Elf32RelocationWithAddend::default();
// serialize the relocation to a statically allocated array on the stack
let bytes = rel.binary_serialize_to_array(Endianness::Little);
// deserialize the relocation from its bytes to get back the original value
let reconstructed_rel =
Elf32RelocationWithAddend::binary_deserialize(bytes.as_ref(), Endianness::Little).unwrap();
assert_eq!(rel, reconstructed_rel)
}
许可证:MIT
依赖项
约1.5MB
约36K SLoC