Con un ejemplo de datos con un valor hexadecimal de 0xda
y un polinomio 0x07
, encontraría el CRC de la siguiente manera (usando la metodología de Wikipedia )
0xda = 11011010
11011010|00000000
111
00111010|00000000
111
00000010|00000000
11 1
00000001|10000000
1 11
00000000|01000000
Pero la respuesta debería estar 0x08
de acuerdo con esta calculadora .
Necesito que la respuesta sea correcta para el estándar Ethernet IEEE. Descubrí que algunas fuentes rellenan los datos y otras no . IEEE parece sugerir que se requiere relleno si los datos son menores que el ancho de CRC.
Nota: sé que el CRC tampoco es estrictamente el resto de los datos divididos por el polinomio.
0xda = 11011010 = 218
0x07 = 00000111 = 7
218/7 = 31 r 1
Como puede ver a continuación, el IEEE describe muchos más pasos que los sugeridos en Wikipedia. ¿Cómo puedo estar seguro de que las calculadoras de CRC en línea dan los valores correctos para Ethernet?
Para mi intento de seguir el estándar (con el ejemplo de CRC de 8 bits) a.) Los primeros 8 bits del marco se complementan
11011010 -> 00100101
c.) Multiplicar por x^8 es equivalente a cambiar por 8 bits (rellenado con ceros)
00100101 -> 00100101 00000000 = 18688
d.) Divida entre G(x)
y obtenga el restoR(x)
18688/7 = 2669 r 5
Actualización: desde entonces obtuve una implementación de vhdl de 8 bits utilizando una tabla de búsqueda de 256 entradas en funcionamiento. O al menos da los mismos resultados que la calculadora online.
Su malentendido ocurre desde el principio. El polinomio dado como 0x7 (cuando se da en notación normal) es al menos un CRC de 4 bits, la calculadora a la que hace referencia calcula un CRC de 8 bits.
En la notación normal, el bit inicial del polinomio es 1 y se omite. Entonces, para un CRC de 8 bits (si queremos verificar la calculadora), el polinomio real no solo tiene 111
una longitud de 9 bits: 10000011 1
porque el noveno bit inicial se omite en esa notación.
Si hago el cálculo con eso:
11011010 00000000
10000011 1
-----------------
01011001 10000000
1000001 11
-----------------
00011000 01000000
10000 0111
-----------------
00001000 00110000
1000 00111
-----------------
00000000 00001000
Voilá, el resultado de la calculadora aparece 0x08.
Cuando se trata de CRC, siempre se habla de división polinomial y no de división normal con resto.
Le sugiero que lea sobre las matemáticas detrás de eso y como está interesado en una implementación de VHDL, supongo que los cálculos también son bastante útiles.
El paso a)
corresponde a un valor init en la calculadora de all FF
por si alguien se lo pregunta. Con ese paso agregado, el resultado se ve así:
00100101 00000000
100000 111
-----------------
00000101 11100000
100 000111
-----------------
00000001 11111100
1 00000111
-----------------
00000000 11111011
Entonces el resultado es 0xFB. La calculadora vinculada en el OP no proporciona ese valor (parece que no es un polinomio estándar). Esta calculadora permite definir un CRC usted mismo. Y si uso el polinomio CRC-8 y un valor inicial de 0xFF, el resultado es el siguiente:
Así que lo mismo que mi cálculo manual.
Robin