Implementación de CRC para ethernet

Con un ejemplo de datos con un valor hexadecimal de 0xday 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 0x08de 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?

Estándar Ethernet CRC

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.

¿Está sembrado el CRC?

Respuestas (1)

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 111una longitud de 9 bits: 10000011 1porque 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 FFpor 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:

Cálculo CRC8

Así que lo mismo que mi cálculo manual.