67 lines
1.2 KiB
C
67 lines
1.2 KiB
C
#include <stdio.h>
|
|
|
|
unsigned long _crcTable[256];
|
|
int _crcTableInitialized = 0;
|
|
|
|
#define CRC32_POLYNOMIAL 0xEDB88320L
|
|
|
|
void CRCTable_Init() {
|
|
int i;
|
|
int j;
|
|
unsigned long crc;
|
|
|
|
if (_crcTableInitialized) {
|
|
return;
|
|
}
|
|
_crcTableInitialized = 1;
|
|
|
|
for (i = 0; i < 256; i++) {
|
|
crc = i;
|
|
for (j = 8; j > 0; j--) {
|
|
if (crc & 1)
|
|
crc = (crc >> 1) ^ CRC32_POLYNOMIAL;
|
|
else
|
|
crc >>= 1;
|
|
}
|
|
_crcTable[i] = crc;
|
|
}
|
|
}
|
|
|
|
unsigned long CRC_BufferInternal(unsigned char *buffer, unsigned long len,
|
|
unsigned long crc) {
|
|
unsigned char *p;
|
|
|
|
// Calculate CRC from buffer
|
|
p = (unsigned char *)buffer;
|
|
while (len-- != 0) {
|
|
unsigned long termA = (crc >> 8) & 0x00FFFFFFL;
|
|
unsigned long termB = _crcTable[((int)crc ^ *p++) & 0xff];
|
|
crc = termA ^ termB;
|
|
}
|
|
|
|
return (crc);
|
|
}
|
|
|
|
unsigned long CRC_Buffer(unsigned char *buffer, unsigned long len,
|
|
unsigned long crc) {
|
|
CRCTable_Init();
|
|
return (CRC_BufferInternal(buffer, len, crc));
|
|
}
|
|
|
|
unsigned long CRC_File(FILE *file) {
|
|
unsigned long crc;
|
|
unsigned char buffer[512];
|
|
|
|
CRCTable_Init();
|
|
|
|
crc = 0xFFFFFFFFL;
|
|
for (;;) {
|
|
// Fill buffer
|
|
size_t count = fread(buffer, 1, 512, file);
|
|
if (count == 0)
|
|
break;
|
|
|
|
crc = CRC_BufferInternal(buffer, (int)count, crc);
|
|
}
|
|
return (crc ^= 0xFFFFFFFFL);
|
|
} |