1 use { 2 super::bits_errors::{BitError, BitErrorValue}, 3 super::bytes_reader::BytesReader, 4 bytes::BytesMut, 5 }; 6 7 pub struct BitsReader { 8 reader: BytesReader, 9 cur_byte: u8, 10 cur_bit_left: u8, 11 } 12 13 impl BitsReader { new(reader: BytesReader) -> Self14 pub fn new(reader: BytesReader) -> Self { 15 Self { 16 reader, 17 cur_byte: 0, 18 cur_bit_left: 0, 19 } 20 } 21 extend_data(&mut self, bytes: BytesMut)22 pub fn extend_data(&mut self, bytes: BytesMut) { 23 self.reader.extend_from_slice(&bytes[..]); 24 } 25 len(&self) -> usize26 pub fn len(&self) -> usize { 27 self.reader.len() * 8 + self.cur_bit_left as usize 28 } 29 is_empty(&self) -> bool30 pub fn is_empty(&self) -> bool { 31 self.len() == 0 32 } 33 read_byte(&mut self) -> Result<u8, BitError>34 pub fn read_byte(&mut self) -> Result<u8, BitError> { 35 if self.cur_bit_left != 0 { 36 return Err(BitError { 37 value: BitErrorValue::CannotReadByte, 38 }); 39 } 40 41 let byte = self.reader.read_u8()?; 42 Ok(byte) 43 } 44 read_bit(&mut self) -> Result<u8, BitError>45 pub fn read_bit(&mut self) -> Result<u8, BitError> { 46 if self.cur_bit_left == 0 { 47 self.cur_byte = self.reader.read_u8()?; 48 self.cur_bit_left = 8; 49 } 50 self.cur_bit_left -= 1; 51 Ok((self.cur_byte >> self.cur_bit_left) & 0x01) 52 } 53 read_n_bits(&mut self, n: usize) -> Result<u64, BitError>54 pub fn read_n_bits(&mut self, n: usize) -> Result<u64, BitError> { 55 let mut result: u64 = 0; 56 for _ in 0..n { 57 result <<= 1; 58 let cur_bit = self.read_bit()?; 59 result |= cur_bit as u64; 60 } 61 Ok(result) 62 } 63 bits_aligment_8(&mut self)64 pub fn bits_aligment_8(&mut self) { 65 self.cur_bit_left = 0; 66 } 67 } 68 69 #[cfg(test)] 70 mod tests { 71 72 use super::BitsReader; 73 use super::BytesReader; 74 use bytes::BytesMut; 75 76 #[test] test_read_bit()77 fn test_read_bit() { 78 let mut bytes_reader = BytesReader::new(BytesMut::new()); 79 80 let data_0 = 2u8; 81 bytes_reader.extend_from_slice(&[data_0]); 82 let data_1 = 7u8; 83 bytes_reader.extend_from_slice(&[data_1]); 84 85 let mut bit_reader = BitsReader::new(bytes_reader); 86 87 assert!(bit_reader.read_bit().unwrap() == 0); 88 assert!(bit_reader.read_bit().unwrap() == 0); 89 assert!(bit_reader.read_bit().unwrap() == 0); 90 assert!(bit_reader.read_bit().unwrap() == 0); 91 92 assert!(bit_reader.read_bit().unwrap() == 0); 93 assert!(bit_reader.read_bit().unwrap() == 0); 94 assert!(bit_reader.read_bit().unwrap() == 1); 95 assert!(bit_reader.read_bit().unwrap() == 0); 96 97 assert!(bit_reader.read_bit().unwrap() == 0); 98 assert!(bit_reader.read_bit().unwrap() == 0); 99 assert!(bit_reader.read_bit().unwrap() == 0); 100 assert!(bit_reader.read_bit().unwrap() == 0); 101 102 assert!(bit_reader.read_bit().unwrap() == 0); 103 assert!(bit_reader.read_bit().unwrap() == 1); 104 assert!(bit_reader.read_bit().unwrap() == 1); 105 assert!(bit_reader.read_bit().unwrap() == 1); 106 } 107 #[test] test_read_n_bits()108 fn test_read_n_bits() { 109 let mut bytes_reader = BytesReader::new(BytesMut::new()); 110 111 let data_0 = 2u8; 112 bytes_reader.extend_from_slice(&[data_0]); 113 let data_1 = 7u8; 114 bytes_reader.extend_from_slice(&[data_1]); 115 bytes_reader.extend_from_slice(&[0b00000010]); 116 117 let mut bit_reader = BitsReader::new(bytes_reader); 118 assert!(bit_reader.read_n_bits(16).unwrap() == 0x207); 119 120 assert!(bit_reader.read_n_bits(5).unwrap() == 0); 121 122 assert!(bit_reader.read_n_bits(3).unwrap() == 2); 123 } 124 125 #[test] test_bits_aligment_8()126 fn test_bits_aligment_8() { 127 let mut bytes_reader = BytesReader::new(BytesMut::new()); 128 let data_0 = 2u8; 129 bytes_reader.extend_from_slice(&[data_0]); 130 let data_1 = 7u8; 131 bytes_reader.extend_from_slice(&[data_1]); 132 133 let mut bit_reader = BitsReader::new(bytes_reader); 134 135 assert!(bit_reader.read_bit().unwrap() == 0); 136 assert!(bit_reader.read_bit().unwrap() == 0); 137 assert!(bit_reader.read_bit().unwrap() == 0); 138 assert!(bit_reader.read_bit().unwrap() == 0); 139 140 bit_reader.bits_aligment_8(); 141 142 assert!(bit_reader.read_bit().unwrap() == 0); 143 assert!(bit_reader.read_bit().unwrap() == 0); 144 assert!(bit_reader.read_bit().unwrap() == 0); 145 assert!(bit_reader.read_bit().unwrap() == 0); 146 147 assert!(bit_reader.read_bit().unwrap() == 0); 148 assert!(bit_reader.read_bit().unwrap() == 1); 149 assert!(bit_reader.read_bit().unwrap() == 1); 150 assert!(bit_reader.read_bit().unwrap() == 1); 151 } 152 } 153