# binrw
[](https://github.com/jam1garner/binrw/actions/workflows/main.yml)
[](https://docs.rs/binrw)
[](https://codecov.io/gh/jam1garner/binrw)
[](https://discord.gg/ABy4Qh549j)
[](https://matrix.to/#/#binrw:matrix.org)
binrw helps you write maintainable & easy-to-read declarative binary data
parsers using ✨macro magic✨.
## Features
* Generates efficient data parsers for structs and enums using `#[derive]`
* Reads data from any source using standard `io::Read + io::Seek` streams
* [Directives in attributes](https://docs.rs/binrw/latest/binrw/attribute)
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](https://docs.rs/binrw/latest/binrw/struct.NullString.html) and
[data indirection using offsets](https://docs.rs/binrw/latest/binrw/struct.FilePtr.html)
* Parses types from third-party crates using
[free functions](https://docs.rs/binrw/latest/binrw/attribute#custom-parsers)
or [value maps](https://docs.rs/binrw/latest/binrw/attribute#map)
* Uses efficient in-memory representations (does not require `#[repr(C)]` or
`#[repr(packed)]`)
* Code in attributes is written as code, not as strings
* Supports no_std
## Usage
```rust
#[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](https://docs.rs/binrw).