#bit-level #endian #bit-read #bit-write #cursor #u7 #u3

bit-cursor

A cursor that supports bit-level reads and writes

6 releases

0.1.5 Mar 25, 2025
0.1.4 Mar 14, 2025
0.1.2 Sep 6, 2024
0.1.1 Jul 23, 2024
0.1.0 May 23, 2022

#571 in Algorithms

Download history 44/week @ 2025-05-12 78/week @ 2025-05-19 29/week @ 2025-05-26 5/week @ 2025-06-16 2/week @ 2025-06-23 18/week @ 2025-06-30 50/week @ 2025-07-07 62/week @ 2025-07-14 3/week @ 2025-07-21 2/week @ 2025-07-28 2/week @ 2025-08-04 31/week @ 2025-08-11 35/week @ 2025-08-18 8/week @ 2025-08-25

76 downloads per month
Used in 3 crates (via packetrs-impl)

Apache-2.0/MIT

43KB
1K SLoC

BitCursor

BitCursor is similar to std::io::Cursor, but allows reading non-standard-width types (e.g. u3, u7, u14) from a given buffer in addition to byte-sized chunks. It's built on top of the nsw_types crate for non-standard-width types and leverages bitvec to provide a more complete implementation.

Examples

let data: Vec<u8> = vec![0b11100000, 0b11101111];
let mut cursor = BitCursor::from_vec(data);

// Read any non-standard-width type from the cursor
let u3_val = cursor.read_u3().unwrap();
assert_eq!(u3_val, nsw_types::u3::new(0b111));
// Sizes larger than 8 bits require a byte order argument
let u13_val = cursor
    .read_u13::<crate::byte_order::NetworkOrder>()
    .unwrap();
assert_eq!(u13_val, nsw_types::u13::new(0b0000011101111));

Design

Traits

BitRead

BitRead is analogus to the std::io::Read trait, but its API is defined in terms of reading from "bit slices" instead of u8 slices (&[u8]) like std::io::Read.

BitWrite

BitWrite is analogus to the std::io::Write trait, but its API is defined in terms of writing to "bit slices" instead of u8 slices (&[u8]) like std::io::Write.

Types

BitCursor

BitCursor is analogous to the std::io::Cursor type, but its API is defined in terms of bits instead of bytes.

Dependencies

~1MB
~28K SLoC