
Сообщение от
Vslav
В Вашем коде делится сообщение уже сдвинутое на 16 разрядов влево, то есть имеет место добавление той самой константы c состоящей из 16 нулевых битов.
Вот классический "безразмерный" вариант, вычисляющий CRC-16 для произвольной последовательности битов.
Внутренний вариант ВП1-128:
Код:
unsigned short int crc16_bitstep( unsigned short crc, int bit )
{
int crc_high_bit = ( crc & 0x8000 ? 1 : 0 );
int DoInvert = bit ^ crc_high_bit;
if( DoInvert ) { crc = (crc << 1) ^ 0x1021; }
else { crc = (crc << 1); }
return crc;
}
unsigned short int crc16( unsigned short crc, unsigned char data )
{
printf("\n %02X ( %04X,", data, crc);
crc = ~crc;
for( unsigned char mask = 0x80 ; mask ; mask >>= 1 )
{
int bit = ( data & mask ? 1 : 0 );
crc = crc16_bitstep( crc, bit );
}
crc = ~crc;
printf(" %04X )", crc );
return crc;
}
int main(int argc, char *argv[])
{
unsigned short crc, tmp;
crc = 0x0000;
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0x30);
crc = crc16(crc, 0x31);
crc = crc16(crc, 0x32);
crc = crc16(crc, 0x33);
tmp = ~crc;
printf("\nCRC: %04X", tmp);
}
Стандартный алгоритм CRC-16:
Код:
unsigned short int crc16_bitstep( unsigned short crc, int bit )
{
int crc_high_bit = ( crc & 0x8000 ? 1 : 0 );
int DoInvert = bit ^ crc_high_bit;
if( DoInvert ) { crc = (crc << 1) ^ 0x1021; }
else { crc = (crc << 1); }
return crc;
}
unsigned short int crc16( unsigned short crc, unsigned char data )
{
printf("\n %02X ( %04X,", data, crc);
for( unsigned char mask = 0x80 ; mask ; mask >>= 1 )
{
int bit = ( data & mask ? 1 : 0 );
crc = crc16_bitstep( crc, bit );
}
printf(" %04X )", crc );
return crc;
}
int main(int argc, char *argv[])
{
unsigned short crc, tmp;
crc = 0xFFFF;
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0x30);
crc = crc16(crc, 0x31);
crc = crc16(crc, 0x32);
crc = crc16(crc, 0x33);
tmp = crc;
printf("\nCRC: %04X", tmp);
}