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 在 编码
96,460 每月下载量
被 127 个 crate 使用 (81 个直接使用)
195KB
4K SLoC
binrw
binrw 帮助您使用✨宏魔法✨编写可维护且易于阅读的声明性二进制数据读取器和写入器。
功能
- 使用
#[derive]
生成结构体和枚举的高效数据解析器和序列化器 - 使用标准的
io::Read
和io::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