1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
const CRC32_POLY: u32 = 0xEDB8_8320;
fn calc_val(val: u8) -> u32 {
let mut crc: u32 = val.into();
for _num in 0..8 {
if crc & 1 == 1 {
crc = crc.wrapping_shr(1) ^ CRC32_POLY;
} else {
crc = crc.wrapping_shr(1);
}
}
crc
}
pub fn calc_crc(msg: &[u8]) -> u32 {
let mut crc: u32 = 0;
for elem in msg.iter() {
let val1 = crc.wrapping_shr(8);
let arg: u32 = crc ^ u32::from(*elem);
let val2 = calc_val(arg as u8);
crc = val2 ^ val1;
}
crc
}
#[test]
fn test_crc() {
let input = [
0xAA, 0x44, 0x12, 0x1C, 0x24, 0x0, 0x0, 0xC0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0xF1, 0x0, 0x0,
0x0,
];
assert_eq!(calc_crc(&input), 0x8BB09602);
}