stackforge_core/utils/
bits.rs1#[inline]
5pub fn extract_bits(byte: u8, start: u8, len: u8) -> u8 {
6 (byte >> (8 - start - len)) & ((1 << len) - 1)
7}
8
9#[inline]
11pub fn set_bits(byte: &mut u8, start: u8, len: u8, value: u8) {
12 let mask = ((1u8 << len) - 1) << (8 - start - len);
13 *byte = (*byte & !mask) | ((value << (8 - start - len)) & mask);
14}
15
16#[inline]
18pub const fn u16_to_be(value: u16) -> [u8; 2] {
19 value.to_be_bytes()
20}
21
22#[inline]
24pub const fn u32_to_be(value: u32) -> [u8; 4] {
25 value.to_be_bytes()
26}
27
28#[inline]
30pub const fn be_to_u16(bytes: [u8; 2]) -> u16 {
31 u16::from_be_bytes(bytes)
32}
33
34#[inline]
36pub const fn be_to_u32(bytes: [u8; 4]) -> u32 {
37 u32::from_be_bytes(bytes)
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn test_extract_bits() {
46 let byte = 0b1010_0110;
47 assert_eq!(extract_bits(byte, 0, 4), 0b1010);
48 assert_eq!(extract_bits(byte, 4, 4), 0b0110);
49 assert_eq!(extract_bits(byte, 2, 4), 0b1001);
50 }
51
52 #[test]
53 fn test_set_bits() {
54 let mut byte = 0b0000_0000;
55 set_bits(&mut byte, 0, 4, 0b1010);
56 assert_eq!(byte, 0b1010_0000);
57
58 set_bits(&mut byte, 4, 4, 0b0110);
59 assert_eq!(byte, 0b1010_0110);
60 }
61}