xref: /xiu/library/bytesio/src/bits_reader.rs (revision 769d75b4)
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