Jak działa CRC?

Rozdział 9 Różne algorytmy CRC

Rozdz. 9.1 Wstęp
Podstawą wszystkich algorytmów jest Rozdz. 4 Arytmetyka CRC. W Rozdz. 5 Obliczanie CRC na rejestrach pokazaliśmy jak ten algorytm przesunięć jednobitowych realizować na rejestrach. Programiści systemów mikroprocesorowych nie posługują się bitami lecz bajtami i tego właśnie dotyczą 3 metody tablicowe z przesunięciami bajtowymi w Rozdz 8:
Tablicowa bezpośrednia
Tablicowa „lewa” z podwójnym xor-owaniem
Tablicowa „prawa” z podwójnym xor-owaniem
Metoda bezpośrednia ma charakter dydaktyczny i dlatego większość stosowanych w praktyce metod to są głównie różne modyfikacje metody “lewej” i “prawej”. 

Rozdz. 9.2 Jak klasyfikować metody CRC?
Znany popularyzator metod CRC pan Ross N. Williams stworzył ogólny program w języku CParametryczny Algorytm Obliczania CRC. Bazuje on na modelu tablicowym „lewym” z podwójnym xor-owaniem. Zmieniając parametry programu np. REFIN, REFOUT… możemy stworzyć nie tylko model “prawy” ale także inne nie ujęte w kursie modyfikacje. Programista korzystający z programu powinien jednak mieć świadomość jego nieoptymalności. Niezależnie od tego, czy będziemy głęboko wchodzić w CRC np. poprzez pisanie konkretnych aplikacji dla urządzeń, to już same parametry ułatwiają klasyfikacje różnych algorytmów CRC. Dlatego poruszam ten temat.
Tymi parametrami są:
– NAME nazwa algorytmu
WIDTH wielkość rejestru CRC  przeważnie 8, 16 albo 32 bity (czasami “niebajtowa” wartość)–>im więcej tym większa moc wykrywania błędów!
POLY wartość “dzielnika” inaczej generatora lub wielomianu*
INIT stan początkowy rejestru CRC. W kursie była to wartość zerowa ale nie zawsze tak jest.
REFIN jeżeli FALSE —>metoda Tablicowa „lewa” z podwójnym xor-owaniem która traktuje bit lewy bajtu jako najstarszy
              jeżeli TRUE—>metoda Tablicowa „prawa” z podwójnym xor-owaniem która traktuje bit prawy bajtu jako najstarszy
REFOUT jeżeli FALSE –>metoda Tablicowa „lewa” z podwójnym xor-owaniem
                  jeżeli TRUE –>metoda  Tablicowa „prawa” z podwójnym xor-owaniem w której obracamy obliczone CRC
– XOROUT wartość bitowa przez którą xor-ujemy obliczone CRC. W kursie była to wartość zerowa ale nie zawsze tak jest.
– CHECK obliczone CRC dla wysyłanej wiadomości którą jest łańcuch “123456789”. Przydaje się do testowania programu.

Rozdz. 9.3 Odwrócone “dzielniki
Występują też tzw. odwrócone  (reversed) “dzielniki” -inaczej odwrócone poly, generatory, wielomiany…
Np. dla  CRC którego standardową nazwą jest X25
X25 standard: 1-0001-0000-0010-0001
–>hexa 1 01 00 02 01
X25 reversed:  1-0000-1000-0001-0001
–>hexa 1 00 80 01 01
Pamiętaj
, że w w odwracaniu bierze też udział pierwszy bit=1 “dzielnika”, niewidocznego w parametrze poly! Jest to zupełnie inne poly niż standard! Nie mylić z metodą tablicową odwróconą (“prawą”)!  Metody z tablicą odwróconą “prawą”  i normalną “lewą” oparte są na tym samym “dzielniku”!

Rozdz. 9.4 Przykłady algorytmów CRC
Name : “CRC-16”
Width : 16
Poly : 8005
Init : 0000
RefIn : True
RefOut : True
XorOut : 0000
Check : BB3D
Uwaga: Parametry Poly, Init, Xorout i Check przedstawiono jako liczby hexa a nie binarne.

Name : “CRC-16/CITT”
Width : 16
Poly : 1021
Init : FFFF
RefIn : False
RefOut : False
XorOut : 0000
Check : ?

Name : “XMODEM”
Width : 16
Poly : 8408
Init : 0000
RefIn : True
RefOut : True
XorOut : 0000
Check : ?

Name : “ARC”
Width : 16
Poly : 8005
Init : 0000
RefIn : True
RefOut : True
XorOut : 0000
Check : ?

I wisienka na torcie!
CRC-32
używany w  PKZip, AUTODIN II, Ethernet i FDDI.

Name : “CRC-32”
Width : 32
Poly : 04C11DB7
Init : FFFFFFFF
RefIn : True
RefOut : True
XorOut : FFFFFFFF
Check : CBF43926

Uwaga:
Nie wszystkie używane w sieci algorytmy CRC łatwo poddają się klasyfikacji!

Scroll to Top