#二进制数据 #转换二进制 #结构体 # #声明宏 #格式 #bitvec

bitread

Rust 中的 bitread 库旨在高效地将小二进制数据转换为 Rust 结构体

2 个版本

0.1.9 2023年11月16日
0.1.6 2023年11月16日

#1881 in 解析器实现

MIT 许可证

11KB
163

bitread

Rust 中的 bitread 库旨在高效地将小二进制数据转换为 Rust 结构体。它要求用户为每个字段指定位计数,并支持 Lsb0 和 Msb0 格式。该库结构紧凑,只提供 "bits" 和 "map" 属性。bitread 的核心概念是

  • 可靠性:它被设计成有效工作。
  • 简洁性:利用宏魔法,它易于适应特定需求。
  • 轻量级:它是一个基于 bitvec 的简洁声明宏。

这种方法确保 bitread 既是用户友好的,又是多功能的,满足 Rust 编程中处理二进制数据的广泛需求。

!请注意,该库目前不支持字节序;它默认使用系统的本地字节序。在处理可能具有特定字节序要求的数据时,这是一个重要的考虑因素。

示例

use bitread::prelude::*;

#[derive(BitRead, Debug, PartialEq)]
#[bitrw(endian = "little", bit_order = "lsb")]
pub struct PositionWithInactivityTimer {
    #[bitrw(bits = 1)]
    last_fix_failed: bool,

    #[bitrw(
        bits = 23,
        map = "|x: i32| { x as f64 * (180.0 / ((1 << 23) as f64)) }"
    )]
    latitude_degrees: f64,
}

fn main() {
    println!("Hello, world!");

      let data = vec![
          0xE8, // Last fix failed (0), 23 bit latitude (remaining bits)
          0x25, // 23 bit latitude (continued)
          0xF4, // 23 bit latitude (continued)
      ];

      let position_with_inactivity_timer =
          PositionWithInactivityTimer::read_from(data.as_slice()).unwrap();

      assert_eq!(
          position_with_inactivity_timer,
          PositionWithInactivityTimer {
              last_fix_failed: false,
              latitude_degrees: -8.33338737487793,
          }
      );
}

其他库

如果您还需要写操作和更多功能,请检查以下库

Deku:Deku 是一个 Rust 库,用于读取和写入二进制数据。它特别适用于解析二进制格式中的数据结构。该库的宏系统简化了数据结构的定义,并提供了用于序列化和反序列化数据的易于使用的接口。其文档和示例可在 Deku GitHub 仓库找到。

Binrw:Binrw 是另一个专注于二进制数据序列化和反序列化的 Rust 库。它以其易用性和灵活性而突出,允许开发人员轻松定义如何从和写入二进制格式读取和写入数据结构。该库支持各种数据类型,并为复杂用例提供定制选项。更多信息,包括使用示例,可在 Binrw GitHub 仓库找到。

这两个库都适用于需要详细控制二进制数据处理的项目,提供了性能和易用性的结合。

依赖项

~3MB
~63K SLoC