tonlib_core_anychain/cell/
util.rs1use std::io;
2
3use bitstream_io::{BitRead, BitReader, Endianness};
4
5use crate::cell::{MapTonCellError, TonCellError};
6
7pub trait BitReadExt {
8 fn read_bits(&mut self, num_bits: usize, slice: &mut [u8]) -> Result<(), TonCellError>;
9}
10
11impl<R: io::Read, E: Endianness> BitReadExt for BitReader<R, E> {
12 fn read_bits(&mut self, num_bits: usize, slice: &mut [u8]) -> Result<(), TonCellError> {
13 let total_bytes = (num_bits + 7) / 8;
14 if total_bytes > slice.len() {
15 let msg = format!(
16 "Attempt to read {} bits into buffer {} bytes",
17 num_bits,
18 slice.len()
19 );
20 return Err(TonCellError::CellParserError(msg));
21 }
22 let full_bytes = (num_bits) / 8;
23 self.read_bytes(&mut slice[0..full_bytes])
24 .map_cell_parser_error()?;
25 let last_byte_len = num_bits % 8;
26 if last_byte_len != 0 {
27 let last_byte = self
28 .read::<u8>(last_byte_len as u32)
29 .map_cell_parser_error()?;
30 slice[full_bytes] = last_byte << (8 - last_byte_len);
31 }
32 Ok(())
33 }
34}