#binary-data #binary-parser #binary #io-write #serialization #binary-encoding #deserialize

no-std binrw

一个使用✨宏魔法✨帮助从二进制数据中读取结构体的Rust crate。

27个不稳定版本

0.14.0 2024年6月7日
0.13.3 2023年11月29日
0.13.0 2023年10月27日
0.11.2 2023年5月15日
0.1.0 2020年9月12日

#49编码

Download history 15307/week @ 2024-05-03 18572/week @ 2024-05-10 19317/week @ 2024-05-17 17903/week @ 2024-05-24 18767/week @ 2024-05-31 18400/week @ 2024-06-07 19298/week @ 2024-06-14 19781/week @ 2024-06-21 18684/week @ 2024-06-28 23331/week @ 2024-07-05 21681/week @ 2024-07-12 26004/week @ 2024-07-19 23690/week @ 2024-07-26 25628/week @ 2024-08-02 22962/week @ 2024-08-09 19752/week @ 2024-08-16

96,460 每月下载量
127 crate 使用 (81 个直接使用)

MIT 许可证

195KB
4K SLoC

binrw

crates tests docs.rs codecov discord matrix: #binrw:matrix.org

binrw 帮助您使用✨宏魔法✨编写可维护且易于阅读的声明性二进制数据读取器和写入器。

功能

  • 使用 #[derive] 生成结构体和枚举的高效数据解析器和序列化器
  • 使用标准的 io::Readio::Write 流从任何来源读取和写入数据
  • 属性中的指令 处理常见的二进制解析任务,如匹配魔数、字节序、填充和对齐、数据验证等
  • 包括用于常见数据结构的可重用类型,如 以null终止的字符串使用偏移量的数据间接引用
  • 使用 自由函数值映射 从第三方crate解析类型
  • 使用高效的内存表示(不需要#[repr(C)]#[repr(packed)]
  • 属性中的代码以代码形式编写,而不是以字符串形式编写,以提高人体工程学和IDE的一等支持
  • 支持no_std

使用方法

#[derive(BinRead)]
#[br(magic = b"DOG", assert(name.len() != 0))]
struct Dog {
    bone_pile_count: u8,

    #[br(big, count = bone_pile_count)]
    bone_piles: Vec<u16>,

    #[br(align_before = 0xA)]
    name: NullString
}

let mut reader = Cursor::new(b"DOG\x02\x00\x01\x00\x12\0\0Rudy\0");
let dog: Dog = reader.read_ne().unwrap();
assert_eq!(dog.bone_piles, &[0x1, 0x12]);
assert_eq!(dog.name.into_string(), "Rudy")

有关更多信息,包括binrw的更详细概述,请访问文档

依赖项

~1.5MB
~38K SLoC