Wielomian dla CRC32 to:
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
Lub szesnastkowo i binarnie:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
Najwyższy wyraz (x 32 ) zwykle nie jest jawnie zapisywany, więc zamiast tego można go przedstawić w postaci szesnastkowej, tak jak
0x 04 C1 1D B7
Możesz policzyć jedynki i zera, ale przekonasz się, że pasują do wielomianu, gdzie 1
jest bitem 0 (lub pierwszym bitem) i x
bitem 1 (lub drugim bitem).
Dlaczego ten wielomian? Ponieważ musi istnieć standard, podany wielomian, a standard został określony przez IEEE 802.3. Niezwykle trudno jest również znaleźć wielomian, który skutecznie wykrywa różne błędy bitowe.
Możesz myśleć o CRC-32 jako o serii „arytmetyki binarnej bez przenoszenia” lub w zasadzie „operacje XOR i przesunięcia”. Technicznie nazywa się to arytmetyką wielomianową.
Aby lepiej to zrozumieć, pomyśl o tym mnożeniu:
(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
Jeśli przyjmiemy, że x jest podstawą 2, otrzymamy:
x^7 + x^3 + x^2 + x^1 + x^0
Czemu? Ponieważ 3x ^ 3 to 11x ^ 11 (ale potrzebujemy tylko 1 lub 0 przed cyfrą), więc przenosimy:
=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
Ale matematycy zmienili reguły, tak że jest to mod 2. Więc w zasadzie każdy binarny wielomian mod 2 jest po prostu dodawaniem bez przeniesienia lub XOR. Więc nasze oryginalne równanie wygląda następująco:
=( 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)
Wiem, że to skok wiary, ale to przekracza moje możliwości jako programisty liniowego. Jeśli jesteś zagorzałym studentem CS lub inżynierem, wzywam to do rozbicia. Wszyscy skorzystają na tej analizie.
Aby więc opracować pełny przykład:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
Teraz dzielimy powiększoną wiadomość przez Poly, używając arytmetyki CRC. To taki sam podział jak poprzednio:
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!!!!
Dzielenie daje iloraz, który odrzucamy, i resztę, czyli obliczoną sumę kontrolną. To kończy obliczenia. Zwykle suma kontrolna jest następnie dołączana do wiadomości, a wynik jest przesyłany. W tym przypadku transmisja wyglądałaby następująco: 11010110111110.
Jako dzielnika używaj tylko liczby 32-bitowej i jako dywidendy używaj całego strumienia. Wyrzuć iloraz i zachowaj resztę. Dodaj resztę na końcu wiadomości i masz CRC32.
Średnia recenzja faceta:
QUOTIENT
----------
DIVISOR ) DIVIDEND
= REMAINDER
- Weź pierwsze 32 bity.
- Przesuwaj bity
- Jeśli 32 bity są mniejsze niż DIVISOR, przejdź do kroku 2.
- XOR 32 bity firmy DIVISOR. Przejdź do kroku 2.
(Należy pamiętać, że strumień musi być podzielny przez 32 bity lub powinien być wypełniony. Na przykład 8-bitowy strumień ANSI musiałby być wypełniony. Również na końcu strumienia podział jest zatrzymywany).
0xEDB88320
można również zapisać msbit-first ( normalny ) jako0x04C11DB7
. Czy wartości tabeli, które znalazłeś w innym miejscu, zostały wygenerowane przy użyciu tego samego wielomianu CRC?