Confusión en archivo Verificación con CRC16 en C

Aquí quiero saber cómo puedo implementar el cálculo CRC16 para cualquier tipo de archivo,

Aquí tengo una idea sobre CRC16 y su lógica de código. Aquí hice una función que toma la ruta del archivo como entrada y averigua el valor CRC de esto. Aquí paso el nombre del archivo en esta función y esta función calcula el valor CRC de este archivo. pero quiero calcular todo tipo de archivos como .tar,.tar.gz,.txt,.bin,.scr etc

¿Así que aquí abro todos los archivos y el modo "rb" y tomo uno por uno los caracteres y descubro el valor CRC de forma correcta? Puede que me esté perdiendo algo en esto. funciona bien para .txt y todos los demás archivos, pero creará problemas en los archivos de tipo .tar, .tar.gz . Porque aquí tengo un archivo que es de 890 MB y su nombre es file.tar.gz y su toma 203 Microsegundos y tengo otro archivo que es 382 MB y su nombre es file2.tar su toma 6097850.000000 Microseconds su increíble para mí cómo es su ¿posible?

Mi pregunta son estas

 1 Some thing problem in my CRC code ? 2 Problem in reading file data style, may be i am reading file data in wrong manner for .tar.gz. 

Aquí está mi código:

 int CRC16(const char* filePath) { //Declare variable to store CRC result. unsigned short result; //Declare loop variables. int intOuterLoopIndex, intInnerLoopIndex, nLen; result = 0xffff; //initialize result variable to perform CRC checksum calculation. //Store message which read from file. //char content[2000000]; //Create file pointer to open and read file. FILE *readFile; //Use to read character from file. char readChar; //open a file for Reading readFile = fopen(filePath, "rb"); //Checking file is able to open or exists. if (!readFile) { fputs("Unable to open file %s", stderr); } /* Here reading file and store into variable. */ int chCnt = 0; while ((readChar = getc(readFile)) != EOF) { result ^= (short) (readChar); for (intInnerLoopIndex = 0; intInnerLoopIndex > 1; //Perform bit shifting. result = result ^ 0xa001; //Perform XOR operation on result. } else { result = result >> 1; //Perform bit shifting. } } //content[chCnt] = readChar; chCnt++; } printf("CRC data length in file: %d", chCnt); return (result); } 

char readChar; está mal, necesita ser int readChar ;

getc () devuelve un int, por lo que puede enviarte una señal de EOF. EOF es probablemente el valor -1

Si convierte el valor de retorno en un char, y lee un byte con el valor 255, 255 se interpretará como -1, y dejará de leer en el primer byte que tiene el valor 255.

Este código es incorrecto en diferentes puntos:

  if (!readFile) { fputs("Unable to open file %s", stderr); } 

Si la apertura del archivo falla, no regresas pero continúa! Y las puts también son incorrectas, no especificas el nombre del archivo.

Además, getc() devuelve un entero, pero lo pones en un char y puede terminar justo cuando encuentra un carácter EOF. No ignore las advertencias del comstackdor …

Descargaría un pequeño progtwig de calculadora CRC, para que pueda probar si su código funciona correctamente.