检查功能比较问题

时间:2013-07-31 14:40:42

标签: c++ crc32

我正在编写一个函数,将从前10个条目包含随机生成的数据的缓冲区(uint32_t lBuffer[10])中提取的32位CRC与在CheckCRC函数内计算的计算CRC进行比较。任何人都可以看到为什么它不想给出真正的结果?任何帮助将不胜感激!

这是功能代码:

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;
}

2 个答案:

答案 0 :(得分:0)

一些问题:

  1. 您在输入数组中使用lLength作为多个uint32_t s,并使用多个字节。它不可能两者兼而有之。如果它是uint32_t的数量,则需要乘以4以获得字节数。

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

  3. 由于将uint32_t数组作为字节数组处理,您的代码依赖于它运行的机器的字节序。

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

答案 1 :(得分:0)

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

如果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++];
}