28 releases
0.14.1 | Oct 13, 2024 |
---|---|
0.14.0 | Jun 7, 2024 |
0.13.3 | Nov 29, 2023 |
0.11.2 | May 15, 2023 |
0.1.0 | Sep 12, 2020 |
#34 in Encoding
76,286 downloads per month
Used in 146 crates
(91 directly)
200KB
4K
SLoC
binrw
binrw helps you write maintainable & easy-to-read declarative binary data readers and writers using ✨macro magic✨.
Features
- Generates efficient data parsers and serialisers for structs and enums using
#[derive]
- Reads and writes data from any source using standard
io::Read
andio::Write
streams - Directives in attributes handle common binary parsing tasks like matching magic numbers, byte ordering, padding & alignment, data validation, and more
- Includes reusable types for common data structures like null-terminated strings and data indirection using offsets
- Parses types from third-party crates using free functions or value maps
- Uses efficient in-memory representations (does not require
#[repr(C)]
or#[repr(packed)]
) - Code in attributes is written as code, not as strings, for improved ergonomics and first-class IDE support
- Supports no_std
Usage
#[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")
For more information, including a more detailed overview of binrw, visit the documentation.
Dependencies
~1.5MB
~40K SLoC