1use crate::{error::*, types::*};
2use bitvec::prelude::*;
3
4pub fn hexdump_slice(slice: &U8SRep) -> Result<String> {
5 let v = slice
6 .iter()
7 .fold("".to_owned(), |s, b| format!("{}{:02X}", s, b));
8 Ok(v)
9}
10
11pub fn hexdump_bitslice<T: BitStore, O: BitOrder>(bs: &BitSlice<T, O>) -> Result<String> {
12 let mut res = BitVec::<T, O>::new();
13 if bs.len() % 8 > 0 {
14 res.extend_from_bitslice(&bitvec![u8, O; 0; 8-bs.len()%8]);
15 }
16 res.extend_from_bitslice(bs);
17 let (pfx, mid, sfx) = unsafe { res.align_to::<u8>() };
18 ensure!(
19 pfx.is_empty() && mid.len() % 8 == 0 && sfx.is_empty(),
20 "Invalid bitslice"
21 );
22
23 let v = mid
24 .to_bitvec()
25 .as_raw_slice()
26 .iter()
27 .fold("".to_owned(), |s, b| format!("{}{:02X}", s, b));
28 Ok(v)
29}
30
31pub fn bitdump_bitslice<T, O>(bits: &BitSlice<T, O>) -> String
32where
33 T: BitStore,
34 O: BitOrder,
35{
36 bits.iter().fold("".to_owned(), |s, b| {
37 format!("{}{}", s, if *b { 1 } else { 0 })
38 })
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44
45 #[test]
46 fn hexdump_slice_test() {
47 let sliced = &{ (0usize..256).map(|x| x as u8).collect::<U8VRep>() };
48 let ans = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF";
49 assert_eq!(ans, hexdump_slice(sliced).unwrap());
50 }
51
52 #[test]
53 fn hexdump_bitslice_test() {
54 assert_eq!(
55 "0FFF",
56 hexdump_bitslice(bitvec![u8,Msb0;1;12].as_bitslice()).unwrap()
57 );
58 assert_eq!(
59 "00AA",
60 hexdump_bitslice(bitvec![u8,Msb0;0,1,0,1,0,1,0,1,0].as_bitslice()).unwrap()
61 );
62
63 (0u8..0xFF).for_each(|x| {
64 let bv = BVRep::from_element(x);
65 assert_eq!(
66 format!("{:02X}", x),
67 hexdump_bitslice(bv.as_bitslice()).unwrap()
68 );
69 })
70 }
71}