Цитата Сообщение от Vslav Посмотреть сообщение
Вот текст программки которая соответствует извлеченному алгоритму
Для прикола - ещё один вариант того же алгоритма, использующий только сдвиги:

Код:
unsigned short int crc16( unsigned short crc, unsigned char data )
{
	printf("\r\n %02X ( %04X,", data, crc);

	crc = ~crc;
	crc =  unsigned char (crc >> 8) | (crc << 8);
	crc ^= data;
	crc ^= unsigned char (crc) >> 4;
	crc ^= crc << 12;
	crc ^= unsigned char (crc) << 5;
	crc = ~crc;
	
	printf(" %04X )", crc );
	return crc;
}

Результат запуска:

Код:
 A1 ( 0000, BBC4 )
 A1 ( BBC4, 6974 )
 30 ( 6974, A1D3 )
 31 ( A1D3, 4EB6 )
 32 ( 4EB6, 1714 )
 33 ( 1714, 6EE9 )
CRC: 9116
 A1 ( 0000, BBC4 )
 A1 ( BBC4, 6974 )
 30 ( 6974, A1D3 )
 31 ( A1D3, 4EB6 )
 32 ( 4EB6, 1714 )
 33 ( 1714, 6EE9 )
 91 ( 6EE9, E9FF )
 16 ( E9FF, FFFF )
TMP: FFFF CRC OK

---------- Post added at 22:20 ---------- Previous post was at 22:04 ----------

В оригинале - это алгоритм CRC-16:

Код:
CRC-16
width=16 poly=0x1021 init=0xFFFF refin=false refout=false
xorout=0x0000 check=0x29B1
Код:
unsigned short int crc16( unsigned short crc, unsigned char data )
{
	printf("\n %02X ( %04X,", data, crc);

	crc =  unsigned char (crc >> 8) | (crc << 8);
	crc ^= data;
	crc ^= unsigned char (crc) >> 4;
	crc ^= crc << 12;
	crc ^= unsigned char (crc) << 5;
	
	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);
}