0

最初の 10 エントリにランダムに生成されたデータが含まれている Buffer ( uint32_t lBuffer[10]) から抽出された 32 ビット CRC を、関数内で計算された計算済み CRCと比較する関数を作成していCheckCRCます。なぜ真の結果を出したくないのか、誰にも分かりますか? どんな助けでも大歓迎です!

関数コードは次のとおりです。

bool CRC32::CheckCRC(const uint32_t* plData , uint32_t lLength, uint32_t previousCrc32)
{
    bool FlagPass;
    uint32_t lCalcCRC,lMsgCRC;


    //Msg CRC needs to be extracted first
    lMsgCRC = plData[lLength-1];

    //Newly calculated CRC
    //lCalcCRC = calculate_CRC32(plData,lLength-1,lInitCRC);

    lCalcCRC = ~previousCrc32;
    unsigned char* current = (unsigned char*) plData;

    while (lLength--)
    {
        lCalcCRC = (lCalcCRC >> 8) ^ crc_table[(lCalcCRC & 0xFF) ^ *current++];
    }
    lCalcCRC = ~lCalcCRC;


    if (lCalcCRC == lMsgCRC)
    {
      FlagPass = true;
    }
    else
    {
      FlagPass = false;
    }
    return FlagPass;
}
4

2 に答える 2

0

いくつかの問題:

  1. 入力配列の s の数とバイト数のlLength両方を使用しています。uint32_t両方はあり得ません。の数の場合uint32_t、4 を掛けてバイト数を取得する必要があります。

  2. 配列の最後の要素には予想される CRC が含まれているため、その要素の CRC を計算することは避けたいので、処理するバイト数から 4 を引きます。

  3. コードはuint32_t、配列をバイト配列として処理するため、実行するマシンのエンディアンに依存します。

  4. CRC-32 計算にはさまざまなバリエーションがあるため、正しいものを使用していることを確認する必要があります。

于 2013-07-31T14:54:26.597 に答える
0

データ バッファーの長さを処理する方法の問題。長さからバッファの CRC を取得するplData[lLength-1]と、配列内の要素の数として解釈されます。後でバッファを反復処理するとき、長さはバッファ内のバイト数であると見なされます。

lLengthバッファから既存の CRC 値を取得するときに、これを補正する必要があるバイト数を表す場合。また、バッファーを反復処理するときに既存の CRC 自体が含まれないように、バッファーのサイズを調整する必要があります。

uint32_t lMsgCRC = *((const uint32_t*)((const char*)plData + lLength) - 1);
lLength -= sizeof(plData[0]);

lLengthバイト数ではなく、配列内の要素数を表す場合は、サイズを調整する必要があります。ここでも、既存の CRC がバッファーの最後にあることを考慮する必要があります。

// Adjust length by size of elements
lLength = (lLength - sizeof(plData[0])) * sizeof(plData[0]);
while (lLength--)
{
    lCalcCRC = (lCalcCRC >> 8) ^ crc_table[(lCalcCRC & 0xFF) ^ *current++];
}
于 2013-07-31T15:01:31.217 に答える