sht0p0r
Сообщений: 23
Оценки: 0
Присоединился: 2008-12-16 03:22:12.390000
|
Иногда получаются отрицательные значения, особенно на больших файлах. Почему? Как можно ускорить расчет контрольной суммы этим алгоритмом? quote:
#include <stdio.h> #include <string.h> unsigned long crc_table[256]; int crc_table_computed=0; void make_crc_table(void){ unsigned long c; int n, k; for (n = 0; n < 256; n++) { c = (unsigned long) n; for (k = 0; k < 8; k++) { if (c & 1) { c = 0xedb88320L ^ (c >> 1); } else { c = c >> 1; } } crc_table[n] = c; } crc_table_computed = 1; } unsigned long update_crc(unsigned long crc, unsigned char *buf, int len){ unsigned long c = crc ^ 0xffffffffL; int n; if (!crc_table_computed) make_crc_table(); for (n = 0; n < len; n++) { c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); } return c ^ 0xffffffffL; } /* Return the CRC of the bytes buf[0..len-1]. */ unsigned long crc(unsigned char *buf, int len) { return update_crc(0L, buf, len); } unsigned long crc_res(char *way,char *name){ char f[256]; unsigned long crc = 0L; unsigned char buffer[255]; int len; FILE *fil; strcpy(f,way); f[strlen(way)-1]='\0'; strcat(f,name); fil=fopen(f,"rb"); do{ len=fread(buffer,sizeof(char), 254, fil); crc = update_crc(crc, buffer, 254); }while (len==254); fclose(fil); return crc; } int main(int argc, char *argv[]) { printf("%ld",crc_res(argv[1],argv[2])); return 0; }
|