Всем доброго времени суток. При расчете 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, входные значения сдвигались влево.
После чего пробовал высчитать контрольную, сумму для -
После расчета получалось - вместо - После, этого перелазил форум и нашел данную схожую тему - 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;
}
И о чудо, контрольные суммы сошлись для описанных выше примеров.
После всего, этого возникает вопрос - это ошибка описания протокола или я что-то не правильно понял и делал?