// -*- coding: utf-8 -*- use crate::messages::MsgCrc; use anyhow as ah; use crc_all::CrcAlgo; static CRC32: CrcAlgo = CrcAlgo::::new(0x4C11DB7, 32, 0, 0, true); pub fn crc32(buf: &[u8]) -> u32 { let mut crc = 0; CRC32.init_crc(&mut crc); CRC32.update_crc(&mut crc, buf) } pub fn check_crc32(buf: &[u8]) -> ah::Result<()> { let begin = buf.len() - MsgCrc::LEN; let end = begin + MsgCrc::LEN; let Ok(rx_crc) = MsgCrc::unpack(&buf[begin..end]) else { return Err(ah::format_err!("Failed to unpack crc.")); }; let end = buf.len() - MsgCrc::LEN; let calc_crc = crc32(&buf[0..end]); if rx_crc.get_crc() != calc_crc { return Err(ah::format_err!( "CRC checksum mismatch (rx={:X}, calc={:X}.", rx_crc.get_crc(), calc_crc )); } Ok(()) } // vim: ts=4 sw=4 expandtab