Il polinomio per CRC32 è:
x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1
O in esadecimale e binario:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
Il termine più alto (x 32 ) di solito non è scritto in modo esplicito, quindi può essere rappresentato in esadecimale proprio come
0x 04 C1 1D B7
Sentiti libero di contare gli 1 e gli 0, ma scoprirai che corrispondono al polinomio, dove 1
è il bit 0 (o il primo bit) ed x
è il bit 1 (o il secondo bit).
Perché questo polinomio? Perché deve esserci uno standard dato polinomio e lo standard è stato impostato da IEEE 802.3. Inoltre è estremamente difficile trovare un polinomio che rilevi efficacemente diversi errori di bit.
Puoi pensare al CRC-32 come a una serie di "Aritmetica binaria senza riporti", o fondamentalmente "Operazioni XOR e spostamento". Questo è tecnicamente chiamato aritmetica polinomiale.
Per capirlo meglio, pensa a questa moltiplicazione:
(x^3 + x^2 + x^0)(x^3 + x^1 + x^0)
= (x^6 + x^4 + x^3
+ x^5 + x^3 + x^2
+ x^3 + x^1 + x^0)
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0
Se assumiamo che x sia in base 2, otteniamo:
x^7 + x^3 + x^2 + x^1 + x^0
Perché? Poiché 3x ^ 3 è 11x ^ 11 (ma abbiamo bisogno solo di 1 o 0 cifre preliminari) quindi trasferiamo:
=1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^100 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^101 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^110 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^111 + 1x^11 + 1x^10 + 1x^1 + x^0
Ma i matematici hanno cambiato le regole in modo che sia mod 2. Quindi, fondamentalmente, qualsiasi polinomio binario mod 2 è solo un'aggiunta senza carry o XOR. Quindi la nostra equazione originale è simile a:
=( 1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0 ) MOD 2
=( 1x^110 + 1x^101 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0 )
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0 (or that original number we had)
So che questo è un atto di fede, ma va oltre le mie capacità di programmatore di linea. Se sei uno studente di informatica o un ingegnere hard-core, sfido a scomporlo. Tutti trarranno vantaggio da questa analisi.
Quindi, per elaborare un esempio completo:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
Ora dividiamo il messaggio aumentato per il Poly usando l'aritmetica CRC. Questa è la stessa divisione di prima:
1100001010 = Quotient (nobody cares about the quotient)
_______________
10011 ) 11010110110000 = Augmented message (1101011011 + 0000)
=Poly 10011,,.,,....
-----,,.,,....
10011,.,,....
10011,.,,....
-----,.,,....
00001.,,....
00000.,,....
-----.,,....
00010,,....
00000,,....
-----,,....
00101,....
00000,....
-----,....
01011....
00000....
-----....
10110...
10011...
-----...
01010..
00000..
-----..
10100.
10011.
-----.
01110
00000
-----
1110 = Remainder = THE CHECKSUM!!!!
La divisione restituisce un quoziente, che viene eliminato, e un resto, che è il checksum calcolato. Questo termina il calcolo. Di solito, il checksum viene quindi aggiunto al messaggio e il risultato trasmesso. In questo caso la trasmissione sarebbe: 11010110111110.
Usa solo un numero a 32 bit come divisore e usa l'intero flusso come dividendo. Getta via il quoziente e conserva il resto. Metti il resto alla fine del tuo messaggio e avrai un CRC32.
Recensione ragazzo medio:
QUOTIENT
----------
DIVISOR ) DIVIDEND
= REMAINDER
- Prendi i primi 32 bit.
- Spostare i bit
- Se 32 bit sono inferiori a DIVISOR, andare al passaggio 2.
- XOR 32 bit di DIVISOR. Vai al passaggio 2.
(Si noti che il flusso deve essere divisibile per 32 bit o dovrebbe essere riempito. Ad esempio, un flusso ANSI a 8 bit dovrebbe essere riempito. Inoltre, alla fine del flusso, la divisione viene interrotta.)
0xEDB88320
può anche essere scritto msbit-first ( normale ) come0x04C11DB7
. I valori della tabella che hai trovato altrove sono stati generati utilizzando lo stesso polinomio CRC?