Код
#if !defined( BYTE )
#define BYTE unsigned char
#endif
#if !defined( WORD )
#define WORD unsigned short
#endif
/* --- crc16() -------------------------------------------------------------------------------------------- **
* Контрольная сумма crc16
* BYTE *buf - указатель на байтовый буфер
* short num - размер буфера в байтах
* Возвращает
* unsigned short crc16 буфера
* -------------------------------------------------------------------------------------------------------- */
WORD crc16( BYTE *buf, WORD num )
{
int i;
unsigned short crc = 0xffff;
while ( num-- )
{ crc ^= *buf++;
i = 8;
do
{ if ( crc & 1 )
crc = ( crc >> 1 ) ^ 0xa001;
else
crc >>= 1;
} while ( --i );
}
return( crc );
}
/* --- crc8() --------------------------------------------------------------------------------------------- **
* Контрольная сумма crc8
* BYTE *buf - указатель на байтовый буфер
* short num - размер буфера в байтах
* Возвращает
* BYTE crc8 буфера
* -------------------------------------------------------------------------------------------------------- */
BYTE crc8( BYTE *buf, WORD num )
{
int i;
BYTE chr, crc = 0;
while ( num-- )
{ chr = *buf++;
i = 8;
do
{ crc = (( chr ^ crc ) & 1 ) ? ((( crc ^ 0x18 ) >> 1 ) | 0x80 ) : (( crc >> 1 ) & ~0x80 );
chr >>= 1;
} while ( --i );
}
return( crc );
}