crc/
table.rs

1use crate::util::*;
2
3pub(crate) const fn crc8_table(width: u8, poly: u8, reflect: bool) -> [u8; 256] {
4    let poly = if reflect {
5        let poly = poly.reverse_bits();
6        poly >> (8u8 - width)
7    } else {
8        poly << (8u8 - width)
9    };
10
11    let mut table = [0u8; 256];
12    let mut i = 0;
13    while i < table.len() {
14        table[i] = crc8(poly, reflect, i as u8);
15        i += 1;
16    }
17    table
18}
19
20pub(crate) const fn crc8_table_slice_16(width: u8, poly: u8, reflect: bool) -> [[u8; 256]; 16] {
21    let poly = if reflect {
22        let poly = poly.reverse_bits();
23        poly >> (8u8 - width)
24    } else {
25        poly << (8u8 - width)
26    };
27
28    let mut table = [[0u8; 256]; 16];
29    let mut i = 0;
30    while i < 256 {
31        table[0][i] = crc8(poly, reflect, i as u8);
32        i += 1;
33    }
34
35    let mut i = 0;
36    while i < 256 {
37        let mut e = 1;
38        while e < 16 {
39            let one_lower = table[e - 1][i];
40            table[e][i] = table[0][one_lower as usize];
41            e += 1;
42        }
43        i += 1;
44    }
45    table
46}
47
48pub(crate) const fn crc16_table(width: u8, poly: u16, reflect: bool) -> [u16; 256] {
49    let poly = if reflect {
50        let poly = poly.reverse_bits();
51        poly >> (16u8 - width)
52    } else {
53        poly << (16u8 - width)
54    };
55
56    let mut table = [0u16; 256];
57    let mut i = 0;
58    while i < table.len() {
59        table[i] = crc16(poly, reflect, i as u16);
60        i += 1;
61    }
62    table
63}
64
65pub(crate) const fn crc16_table_slice_16(width: u8, poly: u16, reflect: bool) -> [[u16; 256]; 16] {
66    let poly = if reflect {
67        let poly = poly.reverse_bits();
68        poly >> (16u8 - width)
69    } else {
70        poly << (16u8 - width)
71    };
72
73    let mut table = [[0u16; 256]; 16];
74    let mut i = 0;
75    while i < 256 {
76        table[0][i] = crc16(poly, reflect, i as u16);
77        i += 1;
78    }
79
80    let mut i = 0;
81    while i < 256 {
82        let mut e = 1;
83        while e < 16 {
84            let one_lower = table[e - 1][i];
85            if reflect {
86                table[e][i] = (one_lower >> 8) ^ table[0][(one_lower & 0xFF) as usize];
87            } else {
88                table[e][i] = (one_lower << 8) ^ table[0][((one_lower >> 8) & 0xFF) as usize];
89            }
90            e += 1;
91        }
92        i += 1;
93    }
94    table
95}
96
97pub(crate) const fn crc32_table(width: u8, poly: u32, reflect: bool) -> [u32; 256] {
98    let poly = if reflect {
99        let poly = poly.reverse_bits();
100        poly >> (32u8 - width)
101    } else {
102        poly << (32u8 - width)
103    };
104
105    let mut table = [0u32; 256];
106    let mut i = 0;
107    while i < 256 {
108        table[i] = crc32(poly, reflect, i as u32);
109        i += 1;
110    }
111
112    table
113}
114
115pub(crate) const fn crc32_table_slice_16(width: u8, poly: u32, reflect: bool) -> [[u32; 256]; 16] {
116    let poly = if reflect {
117        let poly = poly.reverse_bits();
118        poly >> (32u8 - width)
119    } else {
120        poly << (32u8 - width)
121    };
122
123    let mut table = [[0u32; 256]; 16];
124    let mut i = 0;
125    while i < 256 {
126        table[0][i] = crc32(poly, reflect, i as u32);
127        i += 1;
128    }
129
130    let mut i = 0;
131    while i < 256 {
132        let mut e = 1;
133        while e < 16 {
134            let one_lower = table[e - 1][i];
135            if reflect {
136                table[e][i] = (one_lower >> 8) ^ table[0][(one_lower & 0xFF) as usize];
137            } else {
138                table[e][i] = (one_lower << 8) ^ table[0][((one_lower >> 24) & 0xFF) as usize];
139            }
140            e += 1;
141        }
142        i += 1;
143    }
144    table
145}
146
147pub(crate) const fn crc64_table(width: u8, poly: u64, reflect: bool) -> [u64; 256] {
148    let poly = if reflect {
149        let poly = poly.reverse_bits();
150        poly >> (64u8 - width)
151    } else {
152        poly << (64u8 - width)
153    };
154
155    let mut table = [0u64; 256];
156    let mut i = 0;
157    while i < table.len() {
158        table[i] = crc64(poly, reflect, i as u64);
159        i += 1;
160    }
161    table
162}
163
164pub(crate) const fn crc64_table_slice_16(width: u8, poly: u64, reflect: bool) -> [[u64; 256]; 16] {
165    let poly = if reflect {
166        let poly = poly.reverse_bits();
167        poly >> (64u8 - width)
168    } else {
169        poly << (64u8 - width)
170    };
171
172    let mut table = [[0u64; 256]; 16];
173    let mut i = 0;
174    while i < 256 {
175        table[0][i] = crc64(poly, reflect, i as u64);
176        i += 1;
177    }
178
179    let mut i = 0;
180    while i < 256 {
181        let mut e = 1;
182        while e < 16 {
183            let one_lower = table[e - 1][i];
184            if reflect {
185                table[e][i] = (one_lower >> 8) ^ table[0][(one_lower & 0xFF) as usize];
186            } else {
187                table[e][i] = (one_lower << 8) ^ table[0][((one_lower >> 56) & 0xFF) as usize];
188            }
189            e += 1;
190        }
191        i += 1;
192    }
193    table
194}
195
196pub(crate) const fn crc128_table(width: u8, poly: u128, reflect: bool) -> [u128; 256] {
197    let poly = if reflect {
198        let poly = poly.reverse_bits();
199        poly >> (128u8 - width)
200    } else {
201        poly << (128u8 - width)
202    };
203
204    let mut table = [0u128; 256];
205    let mut i = 0;
206    while i < table.len() {
207        table[i] = crc128(poly, reflect, i as u128);
208        i += 1;
209    }
210    table
211}
212
213pub(crate) const fn crc128_table_slice_16(
214    width: u8,
215    poly: u128,
216    reflect: bool,
217) -> [[u128; 256]; 16] {
218    let poly = if reflect {
219        let poly = poly.reverse_bits();
220        poly >> (128u8 - width)
221    } else {
222        poly << (128u8 - width)
223    };
224
225    let mut table = [[0u128; 256]; 16];
226    let mut i = 0;
227    while i < 256 {
228        table[0][i] = crc128(poly, reflect, i as u128);
229        i += 1;
230    }
231
232    let mut i = 0;
233    while i < 256 {
234        let mut e = 1;
235        while e < 16 {
236            let one_lower = table[e - 1][i];
237            if reflect {
238                table[e][i] = (one_lower >> 8) ^ table[0][(one_lower & 0xFF) as usize];
239            } else {
240                table[e][i] = (one_lower << 8) ^ table[0][((one_lower >> 120) & 0xFF) as usize];
241            }
242            e += 1;
243        }
244        i += 1;
245    }
246    table
247}