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

Download history 6/week @ 2024-03-13 11/week @ 2024-03-27 14/week @ 2024-04-03 2/week @ 2024-04-10 18/week @ 2024-04-17 23/week @ 2024-04-24 202/week @ 2024-05-01 223/week @ 2024-05-08 101/week @ 2024-05-15 33/week @ 2024-05-22 62/week @ 2024-05-29 160/week @ 2024-06-05 200/week @ 2024-06-12 185/week @ 2024-06-19 96/week @ 2024-06-26

每月662次下载
elflib 中使用

MIT 许可证

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_intobinary_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