pub struct BitReader<'a> {
data: &'a [u8],
byte_pos: usize,
acc: u32,
nbits: u32,
exhausted: bool,
}
impl<'a> BitReader<'a> {
pub fn new(data: &'a [u8]) -> Self {
Self {
data,
byte_pos: 0,
acc: 0,
nbits: 0,
exhausted: false,
}
}
pub fn exhausted(&self) -> bool {
self.exhausted
}
pub fn get_bit(&mut self) -> u32 {
if self.nbits == 0 {
if self.byte_pos < self.data.len() {
self.acc = self.data[self.byte_pos] as u32;
self.byte_pos += 1;
self.nbits = 8;
} else {
self.exhausted = true;
return 0;
}
}
self.nbits -= 1;
(self.acc >> self.nbits) & 1
}
pub fn get_bits(&mut self, n: u32) -> u32 {
let mut v = 0u32;
for _ in 0..n {
v = (v << 1) | self.get_bit();
}
v
}
}