elemes/velxio-deployer-firmware/main/checksum.c

31 lines
700 B
C

#include "checksum.h"
static uint32_t crc32_table[256];
static int table_initialized = 0;
static void crc32_init_table(void)
{
for (uint32_t i = 0; i < 256; i++) {
uint32_t c = i;
for (int j = 0; j < 8; j++) {
c = (c & 1) ? (0xEDB88320 ^ (c >> 1)) : (c >> 1);
}
crc32_table[i] = c;
}
table_initialized = 1;
}
uint32_t checksum_crc32(const uint8_t *data, size_t len)
{
if (!table_initialized) {
crc32_init_table();
}
if (!data || len == 0) return 0;
uint32_t crc = 0xFFFFFFFF;
for (size_t i = 0; i < len; i++) {
crc = crc32_table[(crc ^ data[i]) & 0xFF] ^ (crc >> 8);
}
return crc ^ 0xFFFFFFFF;
}