長さと一緒にパラメーターとして渡されたデータの CCITT 16 ビット チェックサム値を計算する必要があります。配列 TempStr にテスト データ "123456789" を入力し、null 終端文字を除いた長さの多項式 0x8408 を使用すると、結果文字列 6E90(Hex) が得られます。ヌル終了文字とともに、907A を取得します。多項式を 0x1201 に交換すると、29E2(16 進数) と EFE8(16 進数) という結果が得られます。終端文字はありますが、なしです。
私の質問は次のとおりです。正しい値を取得するには、NULL 終端文字の有無にかかわらず 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);
}