libecc/
util.rs

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}