98 lines
2.5 KiB
C
98 lines
2.5 KiB
C
static uint32_t crc32_table[256] = {0};
|
|
|
|
void init_crc32_table(void) {
|
|
uint32_t c, i, j;
|
|
if (crc32_table[0] == 0) {
|
|
for (i = 0; i < 256; i++) {
|
|
c = i;
|
|
for (j = 0; j < 8; j++) {
|
|
if (c & 1)
|
|
c = 0xedb88320L ^ (c >> 1);
|
|
else
|
|
c = c >> 1;
|
|
}
|
|
crc32_table[i] = c;
|
|
}
|
|
}
|
|
}
|
|
|
|
uint32_t crc32(unsigned char *buffer, unsigned int size) {
|
|
uint32_t crc = 0xFFFFFFFF;
|
|
unsigned int i;
|
|
for (i = 0; i < size; i++) {
|
|
crc = crc32_table[(crc ^ buffer[i]) & 0xFF] ^ (crc >> 8);
|
|
}
|
|
return crc ^ 0xFFFFFFFF;
|
|
}
|
|
|
|
void fillcrc32to(unsigned char *buffer, unsigned int size, unsigned char *outbuffer) {
|
|
uint32_t crc = 0xFFFFFFFF;
|
|
unsigned int i;
|
|
for (i = 0; i < size; i++) {
|
|
crc = crc32_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);
|
|
}
|
|
crc ^= 0xFFFFFFFF;
|
|
outbuffer[0] = crc;
|
|
outbuffer[1] = crc >> 8;
|
|
outbuffer[2] = crc >> 16;
|
|
outbuffer[3] = crc >> 24;
|
|
}
|
|
|
|
void fillcrc32(unsigned char *buffer, unsigned int size) {
|
|
uint32_t crc = 0xFFFFFFFF;
|
|
unsigned int i;
|
|
size -= 4;
|
|
for (i = 0; i < size; i++) {
|
|
crc = crc32_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);
|
|
}
|
|
buffer += size;
|
|
buffer[0] = crc;
|
|
buffer[1] = crc >> 8;
|
|
buffer[2] = crc >> 16;
|
|
buffer[3] = crc >> 24;
|
|
}
|
|
|
|
void adler32_short(unsigned char *buffer, unsigned int size, uint32_t *a, uint32_t *b) {
|
|
for (int i = 0; i < size; i++) {
|
|
*a += buffer[i];
|
|
*b += *a;
|
|
}
|
|
*a %= 65521;
|
|
*b %= 65521;
|
|
}
|
|
|
|
#define NMAX 5552
|
|
uint32_t adler32(unsigned char *buffer, unsigned int size) {
|
|
uint32_t a = 1;
|
|
uint32_t b = 0;
|
|
while ( size >= NMAX ) {
|
|
adler32_short(buffer, NMAX, &a, &b);
|
|
buffer += NMAX;
|
|
size -= NMAX;
|
|
}
|
|
adler32_short(buffer, size, &a, &b);
|
|
return (b << 16) + a;
|
|
}
|
|
#undef NMAX
|
|
|
|
void filladler32(unsigned char *buffer, unsigned int size) {
|
|
size -= 4;
|
|
uint32_t checksum = adler32(buffer, size);
|
|
buffer += size;
|
|
buffer[0] = checksum;
|
|
buffer[1] = checksum >> 8;
|
|
buffer[2] = checksum >> 16;
|
|
buffer[3] = checksum >> 24;
|
|
}
|
|
|
|
int checkadler32(unsigned char *buffer, unsigned int size) {
|
|
size -= 4;
|
|
uint32_t checksum = adler32(buffer, size);
|
|
buffer += size;
|
|
return checksum == (((uint32_t)buffer[3] << 24)
|
|
| ((uint32_t)buffer[2] << 16)
|
|
| ((uint32_t)buffer[1] << 8)
|
|
| (uint32_t)buffer[0]);
|
|
}
|
|
|