h1emu-core 0.6.5

Utility library used in h1emu.
Documentation
mod crc_table;
use crc_table::get_crc_table;
use wasm_bindgen::prelude::*;
use byteorder::{BigEndian,WriteBytesExt};


#[wasm_bindgen]
pub fn append_crc(data: &[u8], crc_seed: usize) -> std::vec::Vec<u8>{
  let mut data_mut = data.to_vec();
  let crc = crc32(&data_mut, crc_seed >> 0);
  data_mut.write_u16::<BigEndian>((crc & 0xffff) as u16).unwrap();
  return data_mut;
}

#[wasm_bindgen]
pub fn crc32(data: &[u8], crc_seed: usize) -> u32{
  let crc32_table = get_crc_table();
  let mut crc = crc32_table[!crc_seed & 0xff];
  crc ^= 0x00ffffff;
  let mut index = (crc_seed >> 8)  ^ crc as usize;
  crc = (crc >> 8) & 0x00ffffff;
  crc ^= crc32_table[index & 0xff];
  index = (crc_seed >> 16) ^ crc as usize;
  crc = (crc >> 8) & 0x00ffffff;
  crc ^= crc32_table[index & 0xff];
  index = (crc_seed >> 24) ^ crc as usize;
  crc = (crc >> 8) & 0x00ffffff;
  crc ^= crc32_table[index & 0xff];
  for i in 0..data.len() {
    index = data[i] as usize ^ crc as usize;
    crc = (crc >> 8) & 0x00ffffff;
    crc ^= crc32_table[index & 0xff];
  }
  return !crc >> 0;
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn crc32_test() {
        let data:[u8;5] =  [0, 21, 0, 0, 2];
        assert_eq!(crc32(&data, 0), 1874907695)
    }
    #[test]
    fn append_crc_test(){
      let data:[u8;24] = [0, 9, 0, 0, 0, 169, 183, 185, 67, 241, 64, 164, 5, 143, 19, 35, 87, 21, 163, 205, 26, 83, 24, 212];
      assert_eq!(append_crc(&data, 0), [0, 9, 0, 0, 0, 169, 183, 185, 67, 241, 64, 164, 5, 143, 19, 35, 87, 21, 163, 205, 26, 83, 24, 212, 220, 81])
    }
}