1769d75b4SHarlan use { 2*ccd9a1faSHarlan super::bits_errors::{BitError, BitErrorValue}, 3769d75b4SHarlan super::bytes_reader::BytesReader, 4*ccd9a1faSHarlan bytes::BytesMut, 5769d75b4SHarlan }; 6769d75b4SHarlan 7769d75b4SHarlan pub struct BitsReader { 8769d75b4SHarlan reader: BytesReader, 9769d75b4SHarlan cur_byte: u8, 10769d75b4SHarlan cur_bit_left: u8, 11769d75b4SHarlan } 12769d75b4SHarlan 13769d75b4SHarlan impl BitsReader { new(reader: BytesReader) -> Self14769d75b4SHarlan pub fn new(reader: BytesReader) -> Self { 15769d75b4SHarlan Self { 16769d75b4SHarlan reader, 17769d75b4SHarlan cur_byte: 0, 18769d75b4SHarlan cur_bit_left: 0, 19769d75b4SHarlan } 20769d75b4SHarlan } 21769d75b4SHarlan extend_data(&mut self, bytes: BytesMut)22769d75b4SHarlan pub fn extend_data(&mut self, bytes: BytesMut) { 23769d75b4SHarlan self.reader.extend_from_slice(&bytes[..]); 24769d75b4SHarlan } 25769d75b4SHarlan len(&self) -> usize26769d75b4SHarlan pub fn len(&self) -> usize { 27769d75b4SHarlan self.reader.len() * 8 + self.cur_bit_left as usize 28769d75b4SHarlan } 29769d75b4SHarlan is_empty(&self) -> bool30769d75b4SHarlan pub fn is_empty(&self) -> bool { 31769d75b4SHarlan self.len() == 0 32769d75b4SHarlan } 33769d75b4SHarlan read_byte(&mut self) -> Result<u8, BitError>34*ccd9a1faSHarlan pub fn read_byte(&mut self) -> Result<u8, BitError> { 35*ccd9a1faSHarlan if self.cur_bit_left != 0 { 36*ccd9a1faSHarlan return Err(BitError { 37*ccd9a1faSHarlan value: BitErrorValue::CannotReadByte, 38*ccd9a1faSHarlan }); 39*ccd9a1faSHarlan } 40*ccd9a1faSHarlan 41*ccd9a1faSHarlan let byte = self.reader.read_u8()?; 42*ccd9a1faSHarlan Ok(byte) 43*ccd9a1faSHarlan } 44*ccd9a1faSHarlan read_bit(&mut self) -> Result<u8, BitError>45769d75b4SHarlan pub fn read_bit(&mut self) -> Result<u8, BitError> { 46769d75b4SHarlan if self.cur_bit_left == 0 { 47769d75b4SHarlan self.cur_byte = self.reader.read_u8()?; 48769d75b4SHarlan self.cur_bit_left = 8; 49769d75b4SHarlan } 50769d75b4SHarlan self.cur_bit_left -= 1; 51769d75b4SHarlan Ok((self.cur_byte >> self.cur_bit_left) & 0x01) 52769d75b4SHarlan } 53769d75b4SHarlan read_n_bits(&mut self, n: usize) -> Result<u64, BitError>54769d75b4SHarlan pub fn read_n_bits(&mut self, n: usize) -> Result<u64, BitError> { 55769d75b4SHarlan let mut result: u64 = 0; 56769d75b4SHarlan for _ in 0..n { 57769d75b4SHarlan result <<= 1; 58769d75b4SHarlan let cur_bit = self.read_bit()?; 59769d75b4SHarlan result |= cur_bit as u64; 60769d75b4SHarlan } 61769d75b4SHarlan Ok(result) 62769d75b4SHarlan } 63769d75b4SHarlan bits_aligment_8(&mut self)64769d75b4SHarlan pub fn bits_aligment_8(&mut self) { 65769d75b4SHarlan self.cur_bit_left = 0; 66769d75b4SHarlan } 67769d75b4SHarlan } 68769d75b4SHarlan 69769d75b4SHarlan #[cfg(test)] 70769d75b4SHarlan mod tests { 71769d75b4SHarlan 72769d75b4SHarlan use super::BitsReader; 73769d75b4SHarlan use super::BytesReader; 74769d75b4SHarlan use bytes::BytesMut; 75769d75b4SHarlan 76769d75b4SHarlan #[test] test_read_bit()77769d75b4SHarlan fn test_read_bit() { 78769d75b4SHarlan let mut bytes_reader = BytesReader::new(BytesMut::new()); 79769d75b4SHarlan 80769d75b4SHarlan let data_0 = 2u8; 81769d75b4SHarlan bytes_reader.extend_from_slice(&[data_0]); 82769d75b4SHarlan let data_1 = 7u8; 83769d75b4SHarlan bytes_reader.extend_from_slice(&[data_1]); 84769d75b4SHarlan 85769d75b4SHarlan let mut bit_reader = BitsReader::new(bytes_reader); 86769d75b4SHarlan 87769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 88769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 89769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 90769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 91769d75b4SHarlan 92769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 93769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 94769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 1); 95769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 96769d75b4SHarlan 97769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 98769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 99769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 100769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 101769d75b4SHarlan 102769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 103769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 1); 104769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 1); 105769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 1); 106769d75b4SHarlan } 107769d75b4SHarlan #[test] test_read_n_bits()108769d75b4SHarlan fn test_read_n_bits() { 109769d75b4SHarlan let mut bytes_reader = BytesReader::new(BytesMut::new()); 110769d75b4SHarlan 111769d75b4SHarlan let data_0 = 2u8; 112769d75b4SHarlan bytes_reader.extend_from_slice(&[data_0]); 113769d75b4SHarlan let data_1 = 7u8; 114769d75b4SHarlan bytes_reader.extend_from_slice(&[data_1]); 115*ccd9a1faSHarlan bytes_reader.extend_from_slice(&[0b00000010]); 116769d75b4SHarlan 117769d75b4SHarlan let mut bit_reader = BitsReader::new(bytes_reader); 118769d75b4SHarlan assert!(bit_reader.read_n_bits(16).unwrap() == 0x207); 119*ccd9a1faSHarlan 120*ccd9a1faSHarlan assert!(bit_reader.read_n_bits(5).unwrap() == 0); 121*ccd9a1faSHarlan 122*ccd9a1faSHarlan assert!(bit_reader.read_n_bits(3).unwrap() == 2); 123769d75b4SHarlan } 124769d75b4SHarlan 125769d75b4SHarlan #[test] test_bits_aligment_8()126769d75b4SHarlan fn test_bits_aligment_8() { 127769d75b4SHarlan let mut bytes_reader = BytesReader::new(BytesMut::new()); 128769d75b4SHarlan let data_0 = 2u8; 129769d75b4SHarlan bytes_reader.extend_from_slice(&[data_0]); 130769d75b4SHarlan let data_1 = 7u8; 131769d75b4SHarlan bytes_reader.extend_from_slice(&[data_1]); 132769d75b4SHarlan 133769d75b4SHarlan let mut bit_reader = BitsReader::new(bytes_reader); 134769d75b4SHarlan 135769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 136769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 137769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 138769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 139769d75b4SHarlan 140769d75b4SHarlan bit_reader.bits_aligment_8(); 141769d75b4SHarlan 142769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 143769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 144769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 145769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 146769d75b4SHarlan 147769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 0); 148769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 1); 149769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 1); 150769d75b4SHarlan assert!(bit_reader.read_bit().unwrap() == 1); 151769d75b4SHarlan } 152769d75b4SHarlan } 153