CRC - wytłumaczenie działania funkcji

0
#define POLYNOMIAL    (0x1070U << 3) 

unsigned char Crc8( unsigned char inCrc, unsigned char inData )
{
    int i;
// liczba 16 bitowa, poniewaz operujemy na 8-bitowym rejestrze i potrzebujemy 8 bitow na reszte CRC, a nasze dane sa 8-bitowe
    unsigned short  data;

    data = inCrc ^ inData;
// przesuwamy o 8, aby zrobic miejsce na reszte CRC, ktora zostanie zwrocona na koncu
    data <<= 8;
  
    // dzielenie wielomianu
    for ( i = 0; i < 8; i++ ) 
    {
        // 0x8000 binarnie znaczy najstarszy bit zmiennej data
        // zerujemy (dodawanie / odejmowanie) XOR az zostanie sama reszta (to co nas interesuje)
        if (( data & 0x8000 ) != 0 )
        {
            data = data ^ POLYNOMIAL;
        }
         // przesuwamy o 1 w prawo bo tracone bity nas nie bola (interesuje nas reszta z dzielenia)
        data = data << 1;
    }
// 8 pierwszych bitow nas nie interesuje, CRC to reszta z dzielenia XOR wielomianu, dlatego zwracam ta wartosc przesuniete o 8 w prawo (pozbywam sie najstarszych bitow, czyli niepotrzebnego wyniku dzielenia).
return (unsigned char)( data >> 8 );
}

Witam,
Mam następującą funkcję obliczającą CRC i próbuje rozszyfrować jej działanie (mój komentarz do tej funkcji). Wiem, że inCrc to wartość wejściowa (domyślnie równa 0), funkcja istnieje po to, aby można było liczyć dla bloku danych (tablica bajtów).
inData to zmienna, której wartość CRC obliczamy.

POLYNOMIAL to pewna liczba będąca wielomianem CRC, czyli pewną wartością używaną do generownia sumy (niektóre z nich są dobre, niektóre nie, kwestia doboru odpowiedniej liczby - tą podał autor).

0x8000 - pewna maska umożliwiająca operowanie na konkretnym bicie, wygląda tak:
1000000000000000
Czyli operacja bitowa: data ^ POLYNOMIAL działa zawsze na najstarszym bicie liczby data.

Pytania:
Wartość liczbowa POLYNOMIAL w systemie dziesiętnym to 33664. To nie jest liczba 9 bitowa jaką powinien być wielomian CRC-9, dlaczego? Pewnie ma to związek z używaniem 16 bitowej zmiennej do obliczeń. Wciąż nie wiem jak wpisywać by do tej funkcji dowolne wielomiany CRC-8.
Ponąć odpowiada wielomianowi: P(x) = x8 + x2 + x + 1
Czy dobrze zrozumiałem działanie kodu? Będę wdzięczny za wytłumaczenie.

0

Napisałem:
"9 bitowa jaką powinien być wielomian CRC-9"
Miało być:
"9 bitowa jaką powinien być wielomian CRC-8"

1 użytkowników online, w tym zalogowanych: 0, gości: 1