Ethernet CRC32 cálculo - software vs resultado algorítmico

Estoy tratando de calcular la secuencia de verificación de trama (FCS) de un paquete Ethernet byte a byte. El polinomio es0x104C11DB7. Seguí el algoritmo XOR-SHIFT visto aquíhttp: //en.wikipedia.org/wiki/Cyclic_redundancy_chec o aquíhttp: //www.woodmann.com/fravia/crctut1.ht

Suponga que la información que se supone que tiene un CRC es solo un byte. Digamos que es 0x03.

step: pad con 32 bits a la derecha

0x0300000000

alinee el polinomio y los datos en el lado izquierdo con su primer bit que no sea cero y xor ellos

0x300000000 xor 0x209823B6E = 0x109823b6e

tomar resto alinear y xor de nuevo

0x109823b6e xor 0x104C11DB7 = 0x0d4326d9

Dado que no quedan más bits, el CRC32 de 0x03 debería ser0x0d4326d9

Desafortunadamente, todas las implementaciones de software me dicen que estoy equivocado, pero ¿qué hice mal o qué están haciendo de manera diferente?

Python me dice:

 "0x%08x" % binascii.crc32(chr(0x03))
 0x4b0bbe37

La herramienta en línea aquíhttp: //www.lammertbies.nl/comm/info/crc-calculation.html#int obtiene el mismo resultado. ¿Cuál es la diferencia entre mi cálculo manual y el algoritmo que usa el software mencionado?

ACTUALIZAR

Resulta que ya había una pregunta similar sobre el desbordamiento de la pila:

Encuentra una respuesta aquíPython CRC-32 ayes

Aunque esto no es muy intuitivo. Si desea una descripción más formal sobre cómo se hace para las tramas de Ethernet, puede consultar laEthernet Documento estándar 802.3 Parte 3 - Capítulo 3.2.9 Campo de secuencia de verificación de trama

Vamos a continuar el ejemplo de arriba:

Revierta el orden de bits de su mensaje. Eso representa la forma en que entrarían al receptor poco a poco.

0x03 por lo tanto es0xC0

Complemente los primeros 32 bits de su mensaje. Observe que rellenamos el byte único con 32 bits nuevamente.

0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00

Complete el método Xor y shift desde arriba nuevamente. Después de unos 6 pasos obtienes:

0x13822f2d

a secuencia de bits anterior se complementa luego.

0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2

Recuerde que invertimos el orden de bits para obtener la representación en el cable Ethernet en el paso uno. Ahora tenemos que revertir este paso y finalmente cumplimos nuestra búsqueda.

0x4b0bbe37

Quien haya ideado esta forma de hacerlo debería ser ...

Muchas veces realmente quieres saber que el mensaje que recibiste es correcto. Para lograr esto, tome su mensaje recibido, incluido el FCS, y realice los mismos pasos del 1 al 5 que se detallan anteriormente. El resultado debería ser lo que llaman residuo. Cuál es una constante para un polinomio dado. En este caso lo es0xC704DD7B.

Como mcdowella menciona que tienes que jugar con tus bits hasta que lo hagas bien, dependiendo de la aplicación que estés utilizando.

Respuestas a la pregunta(8)

Su respuesta a la pregunta