pub struct BitReader<'a> {
data: &'a [u8],
data_index: usize,
databit: u32,
databit_index: u32,
}
impl<'a> BitReader<'a> {
pub fn new(data: &'a [u8]) -> Self {
Self {
databit: 0,
databit_index: 0,
data,
data_index: 0,
}
}
pub fn is_empty(&self) -> bool {
self.data_index >= self.data.len() && self.databit_index == 0
}
pub fn read_bits(&mut self, n: u8) -> Option<u32> {
if n == 0 || n > 32 || self.is_empty() {
return None;
}
let mut retval: u32 = 0;
for _ in 0..n {
if self.databit_index == 0 {
if self.data_index >= self.data.len() {
return None;
}
self.databit = self.data[self.data_index] as u32;
self.data_index += 1;
self.databit_index = 8;
}
retval = (retval >> 1) | ((self.databit & 1) << 31);
self.databit >>= 1;
self.databit_index -= 1;
}
Some(retval >> (32 - n))
}
}