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