Výpočet CRC8. Co je to CRC ?

Výraz:      
    

Infobox

Po použití poprosím o vyplnění krátkého DOTAZNÍKU
čtení / zdroj   Odkud    Směr    Odkud   zápis / cíl    

Existuje více variant výpočtu CRC, které se od sebe mírně liší přípravou vstupních dat, nicméně konečný výpočet probíhá na stejném principu. Výpočet CRC je založen na dělení dvou polynomů. První polynom (dělenec) jsou vstupní data, druhý polynom (dělitel) je předem definovaný řetězec. Zbytek po dělení těchto dvou polynomů je výsledné CRC.

Vstupní řetězec lze po převedení na bity interpretovat jako polynom n-tého stupně, kde n+1 je počet bitů řetězce. Například řetězec "AB" je vyjádřen v bitech jako 0100 0001 0100 0010, a těchto 16 bitů můžeme interpretovat jako polynom maximálně 15. stupně:
0x15 + 1x14 + 0x13 + 0x12 + 0x11 + 0x10 + 0x9 + 1x8 + 0x7 + 1x6 + 0x5 + 0x4 + 0x3 + 0x2 + 1x1 + 0x0 = x14 + x8 + x6 + x1
Zde jde o polynom 14. stupně, protože nejvyšší bit řetězce je 0.
Polynom, kterým se dělí (tzv. generický polynom), má pevně daný stupeň a také hodnotu. Stupeň je daný typem výpočtu, pro CRC8 jde o polynom 8. stupně, pro CRC16 o polynom 16. stupně a podobně. Existuje několik desítek předdefinovaných hodnot polynomů, které se pro výpočet používají, v průvodci používám pro výpočet CRC8 jeden z běžně používaných polynomů s hodnotou: x8 + x2 + x1 + x0 .
Tento polynom lze zapsat analogicky ve dvojkové soustavě jako 9 bitů: 1 0000 0111. Pokud se setkáte se seznamem hodnot generických polynomů v bitové podobě, obvykle se tyto hodnoty udávájí bez nejvýznamějšího bitu, protože ten je vždy 1 z principu daného stupně polynomu. CRC8 má nejvýznamější devátý bit, CRC16 sedmnáctý atp.

Při vlastním výpočtu se nejprve rozšíří vstupní řetězec o pevně daný počet nulových bitů zprava. Pro CRC8 je to o 8 bitů, pro CRC16 o 16 bitů atp. Jelikož se pohybujeme ve dvojkové soustavě, tj. koeficienty nabývají pouze hodnot 0 nebo 1, tak zbytek po dělení polynomem 8. stupně (při výpočtu CRC8) je polynom maximálně 7. stupně. Tento zbytek (neboli výsledné CRC) lze tedy interpretovat jako posloupnost 8 bitů - a tyto bity se právě při výpočtu uloží do přidaných 8 bitů.
Díky rozšíření vstupního řetězce o 8 bitů (v případe CRC8) se tedy vstupní polynom x14 + x8 + x6 + x1 "zvětší" o 8 stupňů na x22 + x16 + x14 + x9 . Výsledné CRC je tedy zbytek po dělení vstupního polynymu x22 + x16 + x14 + x9 generickým polynomem x8 + x2 + x1 + x0 . Tento zbytek je x7 + x2 + x1 + x0 , výsledný CRC kód je tedy binární řetězec 1000 0111.

Algoritmy provádějící dělení polynomů při výpočtu CRC využívají toho, že jde o dvojkovou soustavu. Výpočet lze provést jednoduše jako XOR operaci nad příslušnými bity. Díky tomu lze výpočet jednoduše implementovat i hardwarově a je součástí mnoha síťových a i jiných zařízení určených pro přenos a zpracování dat.

Ve skutečnosti se výše uvedný postup pro výpočet CRC v praxi nepoužívá, zde je uveden pouze jako nejnázornější příklad pro pochopení principů výpočtu. Zde jde o výpočet bit po bitu, kdy se do výpočtu přenese část dat s prvním platným bitem. Rychlejší metoda je metoda výpočtu Byte po Bytu, kde se průběžná hodnota XOR operace nad celým Bytem a generujícím polynomem ukládá do pomocné proměnné a nad touto se dále provádí XOR operace s další průběžnou hodnotou XOR operace dalšího Bytu s generujícím polynomem. Ale vůbec nejrychlejší metodou, která se v drtivé většině algoritmů používá, je metoda dělení Byte po Bytu s využitím tzv. lookup tabulek. Jelikož základní XOR operace probíhá při výpočtu Byte po Bytu nad jedním Bytem a generujícím polynomem, a vstupní hodnota tedy může nabývat pouze 256 různých hodnot (28), a zároveň generující polynom má fixní hodnotu po celou dobu výpočtu, i výsledek této operace může nabývat pouze 256 různých hodnot. Proto je časově výhodnější si před vlastím výpočtem těchto 256 různých výsledků uložit do tzv. lookup tabulky a místo XOR operace se algoritmus pouze podívá do lookup tabulky s příslušným indexem vstupní hodnoty a přečte si rovnou výsledek bez nutnosti výpočtu. Hodnoty lookup tabulky bývají i přímo součástí algoritmu, tím odpadá nutnost si je předpočítat. Samozřejmě pro různé generující polynomy jsou tyto hodnoty různé.