我需要为连同长度一起传递的数据计算CCITT 16位校验和值。如果我用测试数据“123456789”填充我的数组TempStr,则使用长度不包含空终止字符的多项式0x8408,得到结果字符串6E90(十六进制)。加上空终止字符,我得到907A。当我将多项式换成0x1201时,我得到结果29E2(十六进制)和EFE8(十六进制)有和没有终止字符。CCITT CRC 16位起始值0xffff
我的问题是: 我是否需要计算带或不带空终止符的CRC以获得正确的值? 在算法中使用多项式0x1201还是反向多项式0x8408? 给定数据0x29B1的CRC是否正确?我需要正确的值来确定函数是否正常工作。 计算此特定CRC类型的算法是否正确? wData =(unsigned int)0xff & * pData ++ ?? 如果有人能向我解释什么是错的,以及如何解决我的问题,我将非常感激。 谢谢
这是一个使用并显示calculate_CRC16函数的代码:
CHAR_t TestStr[] = {"123456789"};
unsigned short CrcTest = calculate_CRC16(TestStr,sizeof(TestStr)-1);
QString CrcDisplay = QString("CrcTest : %1").arg(CrcTest);
ui->txtDebug->setText(CrcDisplay);
这是calculate_CRC16功能:
UINT16_t MainWindow::calculate_CRC16(CHAR_t* pData, UINT16_t wLength)
{
UCHAR_t i;
UINT16_t wData;
UINT16_t wCrc = 0xffff;
if (wLength == 0)
return (~wCrc);
do
{
for (i=0, wData=(unsigned int)0xff & *pData++; i < 8; i++, wData >>= 1)
{
if ((wCrc & 0x0001)^(wData & 0x0001))
wCrc = (wCrc >> 1)^CRC_POLY;
else wCrc >>= 1;
}
} while (--wLength);
wCrc = ~wCrc;
wData = wCrc;
wCrc = (wCrc << 8) | (wData >> 8 & 0xff);
return (wCrc);
}
我从来没有见过CRC检查,包括终止空或换行或任何东西。对于其他问题,抱歉,没有足够的专家。 –
CRC计算中是否包含终止空值或换行完全取决于它们是否是接收端要检查的数据的一部分。您需要将CRC应用于另一端将应用CRC的数据。还要记住,一些CRC计算函数需要通过CRC函数“推送”虚拟数据(例如一些零),以便从内部状态机中获取最终的CRC。这通常适用于CRC函数,该函数设计用于计算多个带有渐进数据的调用的CRC。 –