Vypoet CRC

Tomáš Hamouz hamouz@alsoft.cz
Úterý Červenec 22 15:47:45 CEST 2008


VS> #include <stdio.h>
VS> #include <stdlib.h>

VS> unsigned int pracstr[]= 
VS> {0x02,0xa0,0x04,0x21,0x03,0xf3,0x01,0x00,0x02,0x00,0x0c,0x00,0x1f,0xff,0x41,0x00,0x00,0x02,0x00,0x64,0x10};

VS> //unsigned int
VS> pracstr[]={0x01,0x00,0x02,0x00,0x0c,0x00,0x60,0xea,0x41,0x00,0x00,0x00,0x00,0x03};
VS>               

VS> unsigned int  crcreg, prenos,i,j,test,plneni;

VS> int main(int argc, char *argv[])
VS> {
VS>   crcreg=0xFFFF;
VS>   
VS>   for (i=0; i<19; i++){
VS>       crcreg=crcreg ^ pracstr[i];
VS>       for (j=0; j<8; j++){
VS>           prenos=crcreg & 1;
VS>           crcreg=crcreg >> 1;
VS>           if (prenos==1)
VS>             crcreg=crcreg^0x8408; //pro HDLC 8408h a musi vyjit zbytek F0B8h
VS>       }    
VS>   } 

VS>   printf ("%x\n",crcreg);
VS>   system("PAUSE");      
VS>   return 0;
VS> }

Důležitý fakt: CCITT polynom je ve tvaru
       x^16 + x^12 + x^5 + 1,

tedy   1 0001 0000 0010 0001
což znamená zápis 0x1021 (17. bit lze vynechat, všichni vědí že tam
je).

Pro pohodlí zpracování se používá reverzní polynom, tedy
      1000 0100 0000 0001, což je 0x8408.
Výsledek je v takovém případě nutné invertovat (XOR 0xFFFF).

Aby fungovalo vyhodnocení výsledku konstantou, musí se CRC přenášet
MSB napřed.

Ve Vašem případě

Přijatá data 0x64 0x10
16 bitová hodnota 0x1064 =  0001 0000 0110 0100
Inverze                     1110 1111 1001 1011 = 0xEF9B

Tomáš
   


>> ------------ Původní zpráva ------------
>> Od: Jan Waclawek <konfera@efton.sk>
>> Předmět: Re: Vypoet CRC
>> Datum: 22.7.2008 15:12:33
>> ----------------------------------------
>> Tych algoritmov je hafo - lisia sa detailami, ale bohuzial na tych to stoji a
>> pada.
>> 
>> Mozno by pomohlo keby ste zverejnili aj nejaku jednoduchu implementaciu pomocou
>> ktorej ste dospeli k tym vysledkom...
>> 
>> wek
>> 
>> 
>> ----- Original Message ---------------
>> 
>> Subject: Re: Vypoet CRC
>>    From: Va Sm <SpiritusII@seznam.cz>
>>    Date: Tue, 22 Jul 2008 14:56:46 +0200 (CEST)
>>      To: HW-news <hw-list@list.hw.cz>
>> 
>> >Trochu konkretneji
>> >mam nasledujici zpravu:
>> >0x02,0xa0,0x04,0x21,0x03,0xf3,0x01,0x00,0x02,0x00,0x0c,0x00,0x1f,0xff,0x41,0x00,0x00,0x02,0x00,0x64,0x10
>> >Posledni 2 bajty jsou pridany CRC k puvodni zprave (urcite jsou ok).
>> >Otazka zni, jak se dopocitat k tem poslednim 2B???
>> >
>> >K zabezpeceni pouzit polynom 0x8408
>> >inicializece crc 0xFFFF
>> >porovnavaci konstanta 0xF0B8
>> >
>> >Pokud vsechny bajty projdou crc algoritmem skutecne vyjde 0xF0B8 - data jsou
>> tedy ok.
>> >Pokud crc algoritmem projdou jen informacni bajty je vysledek oxEF9B, ale to je
>>  zvlastni, cekal bbych vysledek 0x6410. Jak se tedy od 0xEF9B dostat k 0x6410?
>> >
>> >Omlouvam se za konkretni cisla, ale mozna je takto muj dotaz trochu
>> srozumitelnejsi






Další informace o konferenci Hw-list