const fn make_table() -> [u32; 256] {
let mut table = [0u32; 256];
let mut i: u32 = 0;
while i < 256 {
let mut c = i;
let mut k = 0;
while k < 8 {
c = if c & 1 != 0 {
0xEDB8_8320 ^ (c >> 1)
} else {
c >> 1
};
k += 1;
}
table[i as usize] = c;
i += 1;
}
table
}
static TABLE: [u32; 256] = make_table();
#[must_use]
pub(crate) fn crc32(data: &[u8]) -> u32 {
let mut c = 0xFFFF_FFFFu32;
for &b in data {
c = TABLE[((c ^ u32::from(b)) & 0xFF) as usize] ^ (c >> 8);
}
c ^ 0xFFFF_FFFF
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_is_zero() {
assert_eq!(crc32(b""), 0);
}
#[test]
fn check_value() {
assert_eq!(crc32(b"123456789"), 0xCBF4_3926);
}
#[test]
fn known_name_matches_bars_table() {
assert_eq!(crc32(b"SE_GuitarAC_E_Rtm02_BPM120"), 0x0016_4298);
}
}