es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    crc = crc32(buf+5, 5, crc);
    

    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.

Comments are closed.