bipack_ru/src/crc.rs

73 lines
1.9 KiB
Rust
Raw Normal View History

2023-10-17 02:17:42 +03:00
pub struct Crc8 {
table : [u8; 256]
}
impl Crc8 {
pub fn create_msb(polynomial : u8) -> Crc8 {
let msbit : u8 = 0x80;
let mut t : u8 = msbit;
let mut tmp : u8;
let mut i : u32 = 1;
let mut idx : u8;
let mut table : [u8; 256] = [0; 256];
while i < 256 {
if t & msbit != 0 { tmp = polynomial; } else { tmp = 0; }
t = (t << 1) ^ tmp;
for j in 0..i {
idx = (i+j) as u8;
table[(idx) as usize] = table[j as usize] ^ t;
}
i *= 2;
}
return Crc8{ table : table};
}
pub fn create_lsb(polynomial :u8) -> Crc8 {
let mut i :u32 = 0xff;
let mut j :u32;
let mut t :u8 = 1;
let mut tmp :u8;
let mut idx :u8;
let mut table : [u8; 256] = [0; 256];
while i != 0 {
if t & 1 != 0 { tmp = polynomial; } else { tmp = 0; }
t = (t >> 1) ^ tmp;
j = 0;
while j < 256 {
idx = (i+j) as u8;
table[idx as usize] = table[j as usize] ^ t;
j += 2 * i;
}
i >>= 1;
}
return Crc8{ table : table };
}
/// Update CRC using previously calculated value and return new one.
pub fn update(&self, buffer : &[u8], crc: u8) -> u8 {
let mut crc_tmp = crc;
for i in 0..buffer.len() {
crc_tmp = self.table[((crc_tmp ^ buffer[i])) as usize];
}
return crc_tmp;
}
/// Calculate crc8 with default presets compatible with defaults of mp_binary
/// package used in kotlin Divan interfaces (msb, polynomial=0xA7, this is
/// bluetooth presets btw).
pub fn calc(data: &[u8]) -> u8 {
let crc = Crc8::create_msb(0xA7);
crc.update(data, 0)
}
}
#[test]
fn test_crc8() {
let a = [1,2,3,4,5];
assert_eq!(134, Crc8::calc(&a));
}