0

我正在编写一个函数,该函数将从 Buffer ( ) 中提取的 32 位 CRC(前十个条目包含随机生成的数据)与在函数uint32_t lBuffer[10]内计算的计算 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. 您同时使用输入数组中lLength的多个uint32_ts 和字节数。不可能两者兼而有之。如果是 的个数uint32_t,则需要乘以 4 得到字节数。

  2. 由于数组的最后一个元素包含预期的 CRC,因此您希望避免计算该元素的 CRC,因此从要处理的字节数中减去 4。

  3. uint32_t由于将数组处理为字节数组,因此您的代码取决于运行它的机器的字节序。

  4. CRC-32 计算有不同的变体,因此您需要确保使用正确的变体。

于 2013-07-31T14:54:26.597 回答
0

您如何处理数据缓冲区长度的问题。当您从plData[lLength-1]长度中检索缓冲区的 CRC 时,将被解释为数组中的元素数。稍后当您遍历缓冲区时,长度被假定为缓冲区中的字节数。

IflLength表示从缓冲区检索现有 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 回答