pub fn modbus_crc(code: &str) -> String {
let data = decode(code);
let mut tmp = 65535u16;
for buff in data.iter() {
tmp ^= *buff as u16;
for _ in 0..8 {
let t = tmp & 1u16;
if t == 1 {
tmp >>= 1;
tmp ^= 0xa001;
} else {
tmp >>= 1;
}
}
}
let ret1 = tmp >> 8;
let ret1 = ret1 | (tmp << 8);
format!("{code}{ret1:X}")
}
pub fn decode(str: &str) -> Vec<u8> {
hex::decode(str).unwrap_or_default()
}
pub fn encode(data: &[u8]) -> String {
hex::encode(data)
}
#[test]
fn tests() {
let data = encode(b"1");
assert_eq!("31", data);
let data = decode("31");
assert_eq!("1".as_bytes().to_vec(), data);
let data = modbus_crc("1111");
assert_eq!("1111CDEC", data);
}