Tak předpokládejme, že je přijat textový řetězec do přijímacího bufferu char buff[] jako C řetězec, tedy ukončený '\x00'.
Kód: Vybrat vše
// -------------------- tohle do headeru ---------------
...
#define SEED 0x0f1d // pocatecni nstaveni
static unsigned int get_crc(const unsigned char *buff);
static unsigned int update_crc(unsigned char ser_data, unsigned int crc);
....
// ------------------ tohle do kodu ---------------------
unsigned char uc_buff[1024]; // je dostatecne dlouhy pro prijata data
unsigned int ui_crc; // vysledne CRC
...
// --------------- nejaky hlavni beh ----------------
...
ui_crc = get_crc(uc_buff);
....
// -------------- rutiny -------------------------------
unsigned int get_crc(const unsigned char *buff)
{
unsigned int ui_crc = SEED; // vysledne CRC
char *pc_ptr = buff; // pointer do bufferu
while(*ptr)
{
ui_crc = update_crc(*ptr++, ui_crc);
};
return ui_crc;
}
unsigned int update_crc(unsigned char ser_data, unsigned int crc)
{
crc = (unsigned char)(crc >> 8) | (crc << 8);
crc ^= ser_data;
crc ^= (unsigned char)(crc & 0xff) >> 4;
crc ^= (crc << 8) << 4;
crc ^= ((crc & 0xff) << 4) << 1;
return crc;
}
Nějak takhle, trochu jsem update_crc() upravil, abychom se obešli bez globálu. POZOR - píšu to z ruky, neprošlo to překladem ani laděním. To už je na vás.
Na straně odesílatele spočítáte z dat připravených na odeslání CRC, to připojíte za konec dat a vše odešlete. Na straně příjemce spočítáte CRC úplně stejně jako na vysílači a pak je srovnáte s CRC, které bylo přijato. Když se shodne, data nějak akceptujete, když ne, tak je odmítnete. To už je záležitost přenosového protokolu.
Pokud byste přijímal i data, která mohou obsahovat nulové byty, musíte si do výpočtu CRC vnést i údaj o délce dat. Tento údaj stejně musíte přenášet mezi vysílačem a přijímačem, abyste na přijímači věděl, že je přijata celá dávka dat. A vůbec, daleko důležitější než výpočet CRC je stanovit si formát přenášených dat a způsob jejich potvrzování, včetně time-outů, rozeznání zdvojených dat a podobně. Ono to není zas tak jednoduché, pokud to má být robustní a spolehlivé.