31 lines
700 B
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;
|
|
}
|