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
56
57
58
59
60
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 };
        }

        pub fn calc(&mut self, buffer : &[u8], length: i32, crc: u8) -> u8 {
                let mut i : i32 = 0;
                let mut crc_tmp = crc;

                while i < length {
                        crc_tmp = self.table[((crc_tmp ^ buffer[i as usize]) as u8) as usize];
                        i+=1;
                }
                return crc_tmp;
        }
}