utils_box/
bits.rs

1//! # Bits utilities
2//! A toolbox of small utilities that manipulate bitstream data.
3//! Useful for debugging streams from embedded devices.
4
5/// Convert bits stream to vector (MSB is Vec[0])
6pub fn bits_to_vec(bits: u64, out_len: u8) -> Vec<u8> {
7    let mut in_bits = bits;
8    let mut output: Vec<u8> = vec![];
9
10    let mut idx = 0;
11    while in_bits > 0 && idx < out_len {
12        output.push((in_bits & 0x01) as u8);
13        in_bits >>= 1;
14        idx += 1;
15    }
16
17    for _i in idx..out_len {
18        output.push(0);
19    }
20
21    output.into_iter().rev().collect()
22}
23
24/// Convert vector to bits stream (Vec[0] is MSB)
25pub fn vec_to_bits(vec: &[u8]) -> u64 {
26    vec.iter().fold(0b0, |acc, &x| (acc << 1) | x as u64)
27}
28
29pub fn bit_vec_to_hex_string(vec: &[u8]) -> String {
30    let mut hex_string = String::new();
31
32    let mod_vec = vec.len() % 4;
33    let mut vec = vec.to_owned();
34
35    if mod_vec != 0 {
36        vec.append(&mut vec![0; 4 - mod_vec]);
37    }
38
39    for i in (0..vec.len()).step_by(4) {
40        let bits = vec[i..i + 4].iter().fold(0b0, |acc, &x| (acc << 1) | x);
41
42        let char = match bits {
43            0..=9 => bits + 48,
44            10..=15 => bits + 55,
45            _ => unreachable!(),
46        } as char;
47
48        hex_string.push(char);
49    }
50
51    hex_string
52}
53
54#[cfg(test)]
55mod tests {
56    use crate::bits::*;
57
58    #[test]
59    fn bits_to_vec_test() {
60        let received_bit_stream: u64 = 0b110101000100111010110;
61        let expected_bytes_array: Vec<u8> = vec![
62            1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0,
63        ];
64
65        let bytes = bits_to_vec(received_bit_stream, 21);
66
67        assert_eq!(expected_bytes_array, bytes);
68    }
69
70    #[test]
71    fn bit_vec_to_hex_string_test() {
72        let bit_array: Vec<u8> = vec![
73            1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0,
74        ];
75        let expected_string = "D44EB0".to_string();
76
77        let string = bit_vec_to_hex_string(&bit_array);
78
79        assert_eq!(expected_string, string);
80    }
81}