libecc 0.2.2

Library of Error-Correcting Codes for GD
Documentation
use crate::{error::*, types::*};
use bitvec::prelude::*;

pub fn hexdump_slice(slice: &U8SRep) -> Result<String> {
  let v = slice
    .iter()
    .fold("".to_owned(), |s, b| format!("{}{:02X}", s, b));
  Ok(v)
}

pub fn hexdump_bitslice<T: BitStore, O: BitOrder>(bs: &BitSlice<T, O>) -> Result<String> {
  let mut res = BitVec::<T, O>::new();
  if bs.len() % 8 > 0 {
    res.extend_from_bitslice(&bitvec![u8, O; 0; 8-bs.len()%8]);
  }
  res.extend_from_bitslice(bs);
  let (pfx, mid, sfx) = unsafe { res.align_to::<u8>() };
  ensure!(
    pfx.is_empty() && mid.len() % 8 == 0 && sfx.is_empty(),
    "Invalid bitslice"
  );

  let v = mid
    .to_bitvec()
    .as_raw_slice()
    .iter()
    .fold("".to_owned(), |s, b| format!("{}{:02X}", s, b));
  Ok(v)
}

pub fn bitdump_bitslice<T, O>(bits: &BitSlice<T, O>) -> String
where
  T: BitStore,
  O: BitOrder,
{
  bits.iter().fold("".to_owned(), |s, b| {
    format!("{}{}", s, if *b { 1 } else { 0 })
  })
}

#[cfg(test)]
mod tests {
  use super::*;

  #[test]
  fn hexdump_slice_test() {
    let sliced = &{ (0usize..256).map(|x| x as u8).collect::<U8VRep>() };
    let ans = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF";
    assert_eq!(ans, hexdump_slice(sliced).unwrap());
  }

  #[test]
  fn hexdump_bitslice_test() {
    assert_eq!(
      "0FFF",
      hexdump_bitslice(bitvec![u8,Msb0;1;12].as_bitslice()).unwrap()
    );
    assert_eq!(
      "00AA",
      hexdump_bitslice(bitvec![u8,Msb0;0,1,0,1,0,1,0,1,0].as_bitslice()).unwrap()
    );

    (0u8..0xFF).for_each(|x| {
      let bv = BVRep::from_element(x);
      assert_eq!(
        format!("{:02X}", x),
        hexdump_bitslice(bv.as_bitslice()).unwrap()
      );
    })
  }
}