Cálculo de CRC en segmentos
Tengo un problema al intentar calcular el CRC en trozos.
Este es el código:
unsigned int crc32(const unsigned char *buf, int len, unsigned int init){
unsigned int crc = init;
while (len–){
crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
buf++;
}
return crc ^ 0xffffffff;
}
int main(){
unsigned char buf[10]={0,1,2,3,4,5,6,7,8,9};
printf("crc=%08x\n",crc32(buf,10,0xffffffff));
unsigned int crc = crc32(buf,5,0xffffffff);
printf("crc_chunk1=%08x\n",crc);
crc = crc32(buf+5,5,crc);
printf("crc_chunk1+2=%08x\n",crc);
}
la primera llamada a crc calcula los 10 bytes,
la segunda calcula el crc de los primeros 5 bytes
la tercera calcula el crc de los últimos 5 bytes pero toma el resultado crc de los primeros 5 bytes como parámetro
Resultado:
ninguno
crc=9290bbfc
crc_chunk1=06dcaed5
crc_chunk1+2=d5800060
¿Por qué crc no es igual a crc_chunk1+2?
Quiero combinar esos trozos para que el resultado sea el mismo.
Gracias.
davy.ai
El problema parece estar relacionado con el hecho de que la segunda llamada a crc32() está pasando solo los primeros 5 bytes del búfer como entrada, pero la tercera llamada está pasando los últimos 5 bytes del búfer, incluyendo el resultado del cálculo de CRC anterior como entrada. Esto significa que la tercera llamada está realizando realmente un cálculo de CRC en los bytes 6 a 9 del búfer original, en lugar de los bytes 5 a 9 como se pretendía. Para solucionar esto, la tercera llamada debería pasar la porción correcta del búfer, comenzando en la posición correcta:
Esto asegurará que se procese la porción correcta del búfer y que el resultado sea consistente con el cálculo completo del CRC del búfer.