1 #[cfg(test)] 2 mod util_test; 3 4 use util::Error; 5 6 // getPadding Returns the padding required to make the length a multiple of 4 7 pub(crate) fn get_padding(len: usize) -> usize { 8 if len % 4 == 0 { 9 0 10 } else { 11 4 - (len % 4) 12 } 13 } 14 15 // set_nbits_of_uint16 will truncate the value to size, left-shift to start_index position and set 16 pub(crate) fn set_nbits_of_uint16( 17 src: u16, 18 size: u16, 19 start_index: u16, 20 mut val: u16, 21 ) -> Result<u16, Error> { 22 if start_index + size > 16 { 23 return Err(Error::new("invalid size or start_index".to_owned())); 24 } 25 26 // truncate val to size bits 27 val &= (1 << size) - 1; 28 29 Ok(src | (val << (16 - size - start_index))) 30 } 31 32 // appendBit32 will left-shift and append n bits of val 33 pub(crate) fn append_nbits_to_uint32(src: u32, n: u32, val: u32) -> u32 { 34 (src << n) | (val & (0xFFFFFFFF >> (32 - n))) 35 } 36 37 // getNBit get n bits from 1 byte, begin with a position 38 pub(crate) fn get_nbits_from_byte(b: u8, begin: u16, n: u16) -> u16 { 39 let end_shift = 8 - (begin + n); 40 let mask = (0xFF >> begin) & (0xFF << end_shift) as u8; 41 (b & mask) as u16 >> end_shift 42 } 43 44 // get24BitFromBytes get 24bits from `[3]byte` slice 45 pub(crate) fn get_24bits_from_bytes(b: &[u8]) -> u32 { 46 ((b[0] as u32) << 16) + ((b[1] as u32) << 8) + (b[2] as u32) 47 } 48