#include unsigned long CRCTable[256]; int CRCTable_initialized = 0; #define CRC32_POLYNOMIAL 0xEDB88320L void CRCTable_Init() { int i; int j; unsigned long crc; if (CRCTable_initialized) { return; } CRCTable_initialized = 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_Buffer(unsigned char *buffer, int len, unsigned long crc) { unsigned char *p; unsigned long temp1; unsigned long temp2; // Calcular CRC del buffer p = (unsigned char*) buffer; while (len-- != 0) { temp1 = (crc >> 8) & 0x00FFFFFFL; temp2 = CRCTable[((int) crc ^ *p++) & 0xff]; crc = temp1 ^ temp2; } return (crc); } unsigned long CRC_File(FILE *file) { unsigned long crc; int count; unsigned char buffer[512]; unsigned char *p; unsigned long temp1; unsigned long temp2; CRCTable_Init(); crc = 0xFFFFFFFFL; for (;;) { // Llenar el buffer count = fread(buffer, 1, 512, file); if (count == 0) break; // Calcular CRC del buffer crc = CRC_Buffer(buffer, count, crc); } return (crc ^= 0xFFFFFFFFL); }