0

我正在帮助我的一个朋友,他有点卡住,我自己的 C++ 技能非常生疏。我的兴趣和好奇心完全被这个选中了。所以我会尽力解释这一点。请注意它的 32 位检查。

uint32_t CRC32::calculate_CRC32(const uint32_t* plData, uint32_t lLength, uint32_t     previousCrc32)
 {
    uint32_t lCount;
    const uint32_t lPolynomial = 0x04C11DB7;
    uint32_t lCrc = previousCrc32;
    unsigned char* plCurrent = (unsigned char*) plData;
    lCrc ^= *plCurrent++;

    while (lLength-- != 0)
     {
       for (lCount = 0 ; lCount < lLength; lCount++)
       {
        if (lCrc & 1)
        lCrc = (lCrc >> 8) ^ lPolynomial;
           else
             lCrc = lCrc >> 8;
        }
    }

    return lCrc;
}

现在 ILength 是数据包包含的字节数。plData 是需要检查数据的数据包。事实上,该功能有效。但它一点一点起作用。需要改进以逐字节工作。因此,对于所有远超我知识的天才 C++ 开发人员。任何想法都会非常有帮助。提前谢谢各位。

4

1 回答 1

2

阅读Ross Williams 关于 CRC 的优秀教程,尤其是第 9 节“表驱动实现”,它一次计算一个字节而不是一次计算一个位的 CRC。您还可以查看zlib 中涉及更多的 CRC 实现,它一次计算四个字节。您也可以一次计算八个字节

于 2013-07-31T07:40:18.593 回答