Цитата Сообщение от 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);
}