32 lines
637 B
C
32 lines
637 B
C
|
#include "sst_crc.h"
|
||
|
|
||
|
unsigned int sst_crc32(unsigned int crc, void *buffer, unsigned int length)
|
||
|
{
|
||
|
unsigned int i, j;
|
||
|
crc32_data_t crc32;
|
||
|
unsigned int crc32_calc = 0xffffffff;
|
||
|
|
||
|
crc32.crc = crc;
|
||
|
|
||
|
for (i = 0; i < 256; ++i) {
|
||
|
crc32.crc = i;
|
||
|
for (j = 0; j < 8; ++j) {
|
||
|
if (crc32.crc & 1)
|
||
|
crc32.crc = (crc32.crc >> 1) ^ 0xedb88320;
|
||
|
else
|
||
|
crc32.crc >>= 1;
|
||
|
}
|
||
|
crc32.crc_32_tbl[i] = crc32.crc;
|
||
|
}
|
||
|
|
||
|
crc32_calc = 0xffffffff;
|
||
|
for (i = 0; i < length; ++i) {
|
||
|
crc32_calc =
|
||
|
crc32.
|
||
|
crc_32_tbl[(crc32_calc ^ ((unsigned char *)buffer)[i]) & 0xff] ^
|
||
|
(crc32_calc >> 8);
|
||
|
}
|
||
|
|
||
|
return crc32_calc ^ 0xffffffff;
|
||
|
}
|