Aclaración acerca del cálculo de CRC16.
Estoy tratando de calcular CRC por primera vez. He leído algunas páginas que explican qué es el CRC y cómo calcularlo. Principalmente esto: https://www.fatalerrors.org/a/implementation-of-crc-checksum-c-crc16-as-an-example.html
Tengo un código que calcula CRC16
uint16_t CalCrc(uint16_t crc_initial, uint8_t* buf, uint16_t len, uint16_t POLY)
{
unsigned int byte;
unsigned char k;
unsigned short ACC, TOPBIT;
unsigned short remainder = crc_initial;
TOPBIT = 0x8000;
for (byte = 0; byte < len; ++byte)
{
ACC = buf[byte];
remainder ^= ACC;
printf("new remainder = %u \n", remainder);
for (k = 8; k > 0; --k)
{
if (remainder & TOPBIT)
{
remainder = remainder << 1;
remainder = remainder ^ POLY;
}
else
{
remainder = (remainder << 1);
}
}
}
remainder = remainder ^ 0x0000;
printf("result remainder = %02X \n", remainder);
return remainder;
}
y lo llamo en mi main.c:
uint8_t crc_buf[5] = {0x05, 0x03, 0x04, 0x08, 0x04};
CalCrc(0xffff, crc_buf, 5, 0x1021);
El resultado es:
result remainder = BDD5
Como puedes ver en mi llamada a la función, paso 0xffff como valor inicial del CRC y 0x1021 como polinomio.
Estoy tratando de confirmar si mi cálculo es correcto con algunos calculadores de CRC en línea como:
http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
https://crccalc.com/
Según los valores iniciales y polinomiales que utilizo, el resultado debería ser:
¿Alguien podría ayudarme a entender qué está mal aquí? Gracias de antemano.
davy.ai
Parece que la salida de la función
CalCrc
no coincide con el valor CRC esperado, basado en los datos de entrada y el polinomio. Puede haber varias razones para esto, tales como:CalCrc
. Algunas áreas posibles para revisar incluyen la inicialización deTOPBIT
, las condiciones del bucle y las operaciones bit a bit utilizadas para calcular el CRC.CalCrc
. Asegúrese de que la matriz de bytescrc_buf
contenga los bytes correctos en el orden correcto, y que el valor del polinomio sea el mismo que el utilizado por las calculadoras de CRC en línea.CalCrc
y las calculadoras en línea. Algunas calculadoras pueden mostrar el resultado CRC en un formato diferente o con un endianness diferente que la función, así que asegúrese de comparar manzanas con manzanas.Para solucionar este problema más a fondo, podría intentar modificar los datos de entrada o los valores del polinomio y ver si el resultado del CRC cambia como se espera. También podría intentar utilizar una implementación o calculadora de CRC diferente y comparar los resultados para ver si están de acuerdo. ¡Buena suerte!