1
0
Fork 0
mirror of https://codeberg.org/icewind/bitbuffer.git synced 2026-06-03 16:44:06 +02:00
Reading and writing data types of arbitrary bit length that might not be byte-aligned
  • Rust 99.8%
  • Nix 0.2%
Find a file
2021-07-14 00:21:05 +02:00
.github/workflows setup github actions ci 2020-02-13 00:05:51 +01:00
benches cow 2020-12-06 17:35:03 +01:00
bitbuffer_derive fix size expressions 2021-07-13 19:10:09 +02:00
src partialeq 2021-07-14 00:21:05 +02:00
tests write tuple 2021-07-13 20:10:08 +02:00
.gitignore dont save pointer to data 2019-07-24 12:32:18 +02:00
Cargo.toml fix pos when reading malformed utf8 2020-12-06 21:20:33 +01:00
LICENSE-APACHE switch licence to apache/mit 2019-02-22 22:47:56 +01:00
LICENSE-MIT switch licence to apache/mit 2019-02-22 22:47:56 +01:00
README.md optimize push_bits 2020-02-15 14:08:54 +01:00
README.tpl optimize push_bits 2020-02-15 14:08:54 +01:00

Crates.io Documentation Dependency status

bitbuffer

Tools for reading data types of arbitrary bit length and might not be byte-aligned in the source data

The main way of handling with the binary data is to first create a [BitBuffer] ,wrap it into a [BitStream] and then read from the stream.

Once you have a BitStream, there are 2 different approaches of reading data

  • read primitives, Strings and byte arrays, using [read_bool], [read_int], [read_float], [read_bytes] and [read_string]
  • read any type implementing the [BitRead] or [BitReadSized] traits using [read] and [read_sized]
    • [BitRead] is for types that can be read without requiring any size info (e.g. null-terminal strings, floats, whole integers, etc)
    • [BitReadSized] is for types that require external sizing information to be read (fixed length strings, arbitrary length integers

The [BitRead] and [BitReadSized] traits can be used with #[derive] if all fields implement [BitRead] or [BitReadSized].

Examples

use bitbuffer::{BitReadBuffer, LittleEndian, BitReadStream, BitRead};

#[derive(BitRead)]
struct ComplexType {
    first: u8,
    #[size = 15]
    second: u16,
    third: bool,
}

let bytes = vec![
    0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
    0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
];
let buffer = BitReadBuffer::new(bytes, LittleEndian);
let mut stream = BitReadStream::new(buffer);
let value: u8 = stream.read_int(7)?;
let complex: ComplexType = stream.read()?;

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.