pub struct BitReader<'a> {
data: &'a [u8],
pos: usize,
}
impl<'a> BitReader<'a> {
pub fn new(data: &'a [u8]) -> BitReader<'a> {
BitReader { data, pos: 0 }
}
pub fn bit_pos(&self) -> usize {
self.pos
}
pub fn seek_bits(&mut self, bit: usize) {
self.pos = bit;
}
pub fn read(&mut self, n: u32) -> u32 {
let v = self.peek(n);
self.pos += n as usize;
v
}
pub fn peek(&self, n: u32) -> u32 {
let mut v = 0u32;
let mut p = self.pos;
for _ in 0..n {
let byte = self.data.get(p >> 3).copied().unwrap_or(0);
let bit = (byte >> (7 - (p & 7))) & 1;
v = (v << 1) | bit as u32;
p += 1;
}
v
}
pub fn skip(&mut self, n: u32) {
self.pos += n as usize;
}
pub fn read_bool(&mut self) -> bool {
self.read(1) != 0
}
}
#[derive(Default)]
pub struct BitWriter {
bytes: Vec<u8>,
nbits: u8,
cur: u8,
}
impl BitWriter {
pub fn new() -> BitWriter {
BitWriter::default()
}
pub fn write(&mut self, v: u32, n: u32) {
for i in (0..n).rev() {
let bit = ((v >> i) & 1) as u8;
self.cur = (self.cur << 1) | bit;
self.nbits += 1;
if self.nbits == 8 {
self.bytes.push(self.cur);
self.cur = 0;
self.nbits = 0;
}
}
}
pub fn bit_len(&self) -> usize {
self.bytes.len() * 8 + self.nbits as usize
}
pub fn finish(mut self) -> Vec<u8> {
if self.nbits > 0 {
self.cur <<= 8 - self.nbits;
self.bytes.push(self.cur);
}
self.bytes
}
}