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 bit_vec_to_byte_vec(vec: &[u8]) -> Vec<u8> {
26 let mod_vec = vec.len() % 8;
27 let mut vec = vec.to_owned();
28
29 let mut res: Vec<u8> = vec![];
30
31 if mod_vec != 0 {
32 vec.append(&mut vec![0; mod_vec]);
33 }
34
35 for i in (0..vec.len()).step_by(8) {
36 let byte = vec[i..i + 8].iter().fold(0b0, |acc, &x| (acc << 1) | x);
37
38 res.push(byte);
39 }
40
41 res
42}
43
44pub fn vec_to_bits(vec: &[u8]) -> u64 {
45 vec.iter().fold(0b0, |acc, &x| (acc << 1) | x as u64)
46}
47
48pub fn bit_vec_to_hex_string(vec: &[u8]) -> String {
49 let mut hex_string = String::new();
50
51 let mod_vec = vec.len() % 4;
52 let mut vec = vec.to_owned();
53
54 if mod_vec != 0 {
55 vec.append(&mut vec![0; mod_vec]);
56 }
57
58 for i in (0..vec.len()).step_by(4) {
59 let bits = vec[i..i + 4].iter().fold(0b0, |acc, &x| (acc << 1) | x);
60
61 let char = match bits {
62 0..=9 => bits + 48,
63 10..=15 => bits + 55,
64 _ => unreachable!(),
65 } as char;
66
67 hex_string.push(char);
68 }
69
70 hex_string
71}
72
73#[cfg(test)]
74mod tests {
75 use crate::bits::*;
76
77 #[test]
78 fn bits_to_vec_test() {
79 let received_bit_stream: u64 = 0b110101000100111010110;
80 let expected_bytes_array: Vec<u8> = vec![
81 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0,
82 ];
83
84 let bytes = bits_to_vec(received_bit_stream, 21);
85
86 assert_eq!(expected_bytes_array, bytes);
87 }
88
89 #[test]
90 fn bit_vec_to_hex_string_test() {
91 let bit_array: Vec<u8> = vec![
92 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0,
93 ];
94 let expected_string = "D44EB0".to_string();
95
96 let string = bit_vec_to_hex_string(&bit_array);
97
98 assert_eq!(expected_string, string);
99 }
100}