我需要爲連同長度一起傳遞的數據計算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。 –