Narzędzia użytkownika

Narzędzia witryny


crc

To jest stara wersja strony!


Biblioteka Boost::CRC

Jakub Maćkowiak T-TIZ

Wstęp

Biblioteka Boost::CRC należy do typu Header-only biblioteki boost. Biblioteka ta wspiera dwa szablony klas służące do

tworzenia obiektów mogących obliczać i/lub sprawdzać poprawność cyklicznego kodu nadmiarowego (CRC ang. Cyclic Redundancy

Check). Nagłówek ten zawiera także szablony funkcji pozwalających obliczyć CRC.

CRC - Wprowadzenie

Jest to kod nadmiarowy, pozwalający wykryć błędy w transmisji bloków danych. Jego obliczanie polega na podzieleniu wielomianu

utworzonego z ciągu bitów (na zasadzie 1101 → x^3 + x^2 + 1) z ustalonym dla danego algorytmu wielomianem CRC. Wynikowym

blokiem nadmiarowym jest reszta powstała z tego dzielenia (iloraz jest odrzucany). Stopień wielomianu reszty (odpowiadający

jego długości bitowej), jest nie większy niż pomniejszony o 1 stopień wielomianu dzielnika CRC.

Parametry

W Boost:CRC użytkownik może sterować działaniem klas obliczających CRC mając do dyspozycji poniższe parametry:

* Truncated polynominal - Skrócony wielomian dzielący. Skrócenie polega na opuszczeniu pierwszego bitu

(odpowiadającemu współczynnikowi przed najwyższą potęgą wielomianu), ponieważ bit ten zawsze jest równy 1. W innym przypadku

byłby to wielomian niższego rzędu niż zakładany.

* Initial remainder - początkowa wartość reszty z dzielenia - wprowadzona po to by uniknąć „ślepych punktów”, czyli

sytuacji w których dla pewnych szczególnych wiadomości, ich kod CRC będzie zaczynał się od samych zer.

* Final XOR value - ciąg bitów z którymi wartość końcowa CRC jest XOR'owana. Zazwyczaj jest to ciąg samych zer lub

samych jedynek.

* Reflected input - parametr typu boolean określający czy ciąg wejściowy ma być odwracany przed obliczeniem kodu

nadmiarowego.

* Reflected output - parametr typu boolean określający czy ciąg wyjściowy (kod nadmiarowy) ma być odwrócony. Dla obu

powyższych parametrów przez odwrócenie rozumiemy zamianę miejscami bitu pierwszego z ostatnim, drugiego z przedostatnim itd.

Dostęp do parametrów jest umożliwiony przez odpowiednie metody „get”.

Klasa Podstawowa boost::crc_basic

Jest to szablon, który jako jedyny parametr przyjmuje Skrócony wielomian dzielący (Truncated polynominal). Kolejne parametry

podawane są w konstruktorze. Jest to implementacja nieoptymalna. Kod nadmiarowy jest obliczany bit po bicie. Poniżej

przykładowa definicja obiektu klasy podstawowej:

boost::crc_basic<8>  crc_podstawowa( 0x25, 0x00, 0, false, false );

Klasa Optymalna boost::crc_optimal

Szablon którego parametrami są wszystkie wymienione powyżej parametry. Jego zaletą jest to, że kod liczony jest jako całość

co pozwala na optymalizację obliczeń. Ponadto parametry zazwyczaj są niezmienne więc korzystne jest wprowadzenie ich w czasie

kompilacji (w odróżnieniu od klasy Podstawowej). Przykładowa definicja:

boost::crc_optimal<8, 0x25, 0x00, 0, false, false>  crc_optymalna;

Operacje

* void process_bit( bool bit ); → przetworzenie pojedynczego bitu (wyłącznie dla klasy Podstawowej)

* void process_bits( unsigned char bits, std::size_t bit_count ); → przetworzenie dowolnej ilości bitów (wyłącznie

dla klasy podstawowej)

* void process_byte( unsigned char byte ); → przetworzenie pojedynczego bajtu

* void process_block( void const *bytes_begin, void const *bytes_end ); → przetworzenie bloku bajtów (parametrami

są początek i koniec)

* void process_bytes( void const *buffer, std::size_t byte_count ); → przetworzenie dowolnej ilości bajtów

* value_type checksum() const; → zwrócenie aktualnej wartości reszty kodowej

* void operator ()( unsigned char byte ); → przeciążony operator, woła process_byte (wyłącznie dla klasy

optymalnej)

* value_type operator ()() const; → zwraca aktualną wartość reszty kodowej (wyłącznie dla klasy optymalnej)

Kod z przykładowym wykorzystaniem

crc.1241044328.txt.gz · ostatnio zmienione: 2009/04/30 00:32 przez qboosh