Код:
unsigned short owenCRC16(unsigned char* packet, size_t length)
{
	size_t i, j;
	unsigned short crc;

	assert(packet);

	crc = 0;
	for (i = 0; i < length; ++i)
	{
		unsigned char b = packet[i];
		for (j = 0; j < 8; ++j, b <<= 1)
		{
			if ((b ^ (crc >> 8)) & 0x80)
			{
				crc <<= 1;
				crc ^= 0x8F57;
			}
			else
				crc <<= 1;
		}
	}
	return crc;
}

http://www.owen.ru/forum/showthread....F1%F3%EC%EC%E0