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