Sto provando a calcolare il Frame Check Sequence (FCS) di un pacchetto Ethernet byte per byte. Il polinomio è 0x104C11DB7
. ho seguito l'algoritmo XOR-SHIFT visto qui http://en.wikipedia.org/wiki/Cyclic_redundancy_check o qui http://www.woodmann.com/fravia/crctut1.htmCalcolo Ethernet CRC32 - software vs risultato algoritmico
assuma le informazioni che si suppone hanno un CRC è un solo byte. Diciamo che è 0x03.
passo: pad con 32 bit verso destra
0x0300000000
allineare il polinomio e consistenza a sinistra con il primo bit che non è zero e XOR loro
0x300000000 xor 0x209823B6E = 0x109823b6e
take restante allineare e xor nuovamente
0x109823b6e xor 0x104C11DB7 = 0x0d4326d9
Dato che non ci sono più po 'lasciato il CRC32 di 0x03 dovrebbe essere 0x0d4326d9
Purtroppo tutte le implementazioni software mi dicono che sbaglio, ma che cosa ho fatto di sbagliato o che cosa stanno facendo diversamente?
Python mi dice:
"0x%08x" % binascii.crc32(chr(0x03))
0x4b0bbe37
Lo strumento on-line qui http://www.lammertbies.nl/comm/info/crc-calculation.html#intr ottiene lo stesso risultato. Qual è la differenza tra il mio calcolo manuale e l'algoritmo utilizzato dal software menzionato?
UPDATE:
Abbiamo scoperto che c'era una domanda simile già in stack overflow:
Potete trovare una risposta qui Python CRC-32 woes
Anche se questo non è molto intuitivo. Se si desidera una descrizione più formale su come è fatto per Ethernet cornici si può guardare il Ethernet Standard document 802.3 Parte 3 - Capitolo 3.2.9 Frame Check Sequence campo
Consente continuare l'esempio dall'alto:
Invertire l'ordine dei bit del tuo messaggio. Questo rappresenta il modo in cui sarebbero entrati nel ricevitore a poco a poco.
0x03
è quindi0xC0
complemento del primo 32 bit del messaggio. Si noti che il singolo byte viene ripetuto con 32 bit nuovamente.
0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00
Completa il Xor e metodo di spostamento dall'alto di nuovo. Dopo circa 6 passo si ottiene:
0x13822f2d
Il bit sequense sopra viene poi completato.
0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2
Ricordate che abbiamo invertito l'ordine po 'per ottenere la rappresentazione sul filo Ethernet al punto uno. Ora dobbiamo invertire questo passo e alla fine completiamo la nostra ricerca.
0x4b0bbe37
Chi si avvicinò con questo modo di fare che dovrebbe essere ...
Un sacco di volte si vuole realmente sapere che il messaggio ricevuto è corretto. Per raggiungere questo obiettivo, si prende il messaggio ricevuto, incluso FCS, e si esegue lo stesso passaggio da 1 a 5 come sopra. Il risultato dovrebbe essere quello che chiamano il residuo. Che è una costante per un dato polinomio. In questo caso è 0xC704DD7B
.
Come mcdowella menzioni devi giocare con i tuoi bit fino a quando non lo fai, a seconda dell'applicazione che si sta utilizzando.
Da dove proviene 0x209823B6E? – grieve
Inoltre hai impostato il resto iniziale su 0xFFFFFFFF – grieve
il 0x209823B6E è una versione spostata del polinomio per allinearlo con i dati – sebs