Всем доброго времени суток. При расчете CRC сталкнулся вот с какой ситуацией:
1. Взял из примера - http://www.softelectro.ru/8_1.html, данные чтобы рассчитать ее CRC и проверить правильность алгоритма.
Брал формулу расчета CRC тут - http://www.owen.ru/uploads/type_prot_owen.zip, из пункта 4.5, в тогде, функция получилась следующая :
Код:
//Âû÷èñëåíèå CRC
UINT Hash(USINT ArrayData[120],INT Len)
{
	INT j,i;
	UINT CRC;
	USINT Byte;
	CRC = 0x0000;
	for (j = 0;j < Len;j++)
	{
		Byte = ArrayData[j] << 1 ;
		for (i = 0; i < 7; i++, Byte <<= 1)
		{
			if (  ( Byte ^ (CRC>>8) ) & 0x80  )
			{
				CRC <<= 1;  CRC ^= 0x8F57;
			}
			else  CRC <<= 1;
		}
	}
	return CRC;
}
Код:
Byte = ArrayData[j] << 1 ;
- данная строка, получалась, так как в примере описанном ниже в п.4.5, входные значения сдвигались влево.

После чего пробовал высчитать контрольную, сумму для -
Код:
0x04 0x10 0xC1 0x73
После расчета получалось -
Код:
0xBD 0xEA
вместо -
Код:
0x79 0x1E
После, этого перелазил форум и нашел данную схожую тему - http://www.owen.ru/forum/showthread....1%F7%E5%F2+CRC, при проверки его контрольной суммы, она совпадала с его рассчитанной, но не с той которая должна была получиться.
После этого, в той же теме привлек мое внимание 3 пост - http://www.owen.ru/forum/showpost.ph...74&postcount=3, с рассчетом CRC на QT, где не было просто первоначального левого сдвига и старшим битом считался не 7, как написано было в оф.описании протокола, а 8 бит, после не хитрой корректировки, получилось следующее :
Код:
UINT Hash(USINT ArrayData[120],INT Len)
{
	INT j,i;
	UINT CRC;
	USINT Byte;
	CRC = 0x0000;
	for (j = 0;j < Len;j++)
	{
		Byte = ArrayData[j] ;
		for (i = 0; i < 8; i++, Byte <<= 1)
		{
			if (  ( Byte ^ (CRC>>8) ) & 0x80  )
			{
				CRC <<= 1;  CRC ^= 0x8F57;
			}
			else  CRC <<= 1;
		}
	}
	return CRC;
}
И о чудо, контрольные суммы сошлись для описанных выше примеров.

После всего, этого возникает вопрос - это ошибка описания протокола или я что-то не правильно понял и делал?