1pub 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
24pub 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}