Le polynôme pour CRC32 est:
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
Ou en hexadécimal et binaire:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
Le terme le plus élevé (x 32 ) n'est généralement pas écrit explicitement, il peut donc être représenté en hexadécimal comme
0x 04 C1 1D B7
N'hésitez pas à compter les 1 et les 0, mais vous constaterez qu'ils correspondent au polynôme, où 1
est le bit 0 (ou le premier bit) et le x
bit 1 (ou le deuxième bit).
Pourquoi ce polynôme? Parce qu'il doit y avoir un polynôme donné standard et que le standard a été défini par IEEE 802.3. Il est également extrêmement difficile de trouver un polynôme qui détecte efficacement différentes erreurs sur les bits.
Vous pouvez considérer le CRC-32 comme une série d '«arithmétique binaire sans portage», ou fondamentalement «opérations XOR et décalage». C'est ce qu'on appelle techniquement l'arithmétique polynomiale.
Pour mieux le comprendre, pensez à cette multiplication:
(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
Si nous supposons que x est la base 2, nous obtenons:
x^7 + x^3 + x^2 + x^1 + x^0
Pourquoi? Parce que 3x ^ 3 est 11x ^ 11 (mais nous n'avons besoin que de 1 ou 0 pré-chiffre), nous reportons donc:
=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
Mais les mathématiciens ont changé les règles pour que ce soit le mod 2. Donc, fondamentalement, tout polynôme binaire mod 2 est juste une addition sans report ni XOR. Donc, notre équation originale ressemble à:
=( 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)
Je sais que c'est un acte de foi, mais cela dépasse mes capacités en tant que programmeur en ligne. Si vous êtes un étudiant ou un ingénieur en CS inconditionnel, je mets au défi de décomposer cela. Tout le monde bénéficiera de cette analyse.
Donc, pour élaborer un exemple complet:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
Maintenant, nous divisons le Message augmenté par le Poly en utilisant l'arithmétique CRC. C'est la même division que précédemment:
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 division donne un quotient, que nous jetons, et un reste, qui est la somme de contrôle calculée. Cela met fin au calcul. Habituellement, la somme de contrôle est ensuite ajoutée au message et le résultat est transmis. Dans ce cas, la transmission serait: 11010110111110.
Utilisez uniquement un nombre 32 bits comme diviseur et utilisez l'intégralité de votre flux comme dividende. Jetez le quotient et conservez le reste. Tack le reste à la fin de votre message et vous avez un CRC32.
Critique moyenne des gars:
QUOTIENT
----------
DIVISOR ) DIVIDEND
= REMAINDER
- Prenez les 32 premiers bits.
- Bits de décalage
- Si 32 bits sont inférieurs à DIVISOR, passez à l'étape 2.
- XOR 32 bits par DIVISOR. Passez à l'étape 2.
(Notez que le flux doit être divisible par 32 bits ou il doit être complété. Par exemple, un flux ANSI 8 bits devrait être complété. Également à la fin du flux, la division est interrompue.)
0xEDB88320
peut également être écrit msbit-first ( normal ) comme0x04C11DB7
. Les valeurs de table que vous avez trouvées ailleurs ont-elles été générées en utilisant le même polynôme CRC?