CRC32计算不正确

时间:2015-07-05 14:26:46

标签: c++ crc32

我使用一种非常简单的算法来计算CRC32,但它给出了错误的值。

我将输出值与calculator进行比较,但总是看起来不同

unsigned int crc32_tab[256] = {
        0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
        0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
        0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
        0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
      .........,..............,.............,.........,...........
    };

使用查找表的函数是

 unsigned int MyClass::crc32(unsigned int crc, const void *buf, unsigned int   size)
{
const unsigned int *p;

p = (const quint8 *)buf;
crc = crc ^~ 0xFFFFFFFF;

while(size--)
{
    crc = this->crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
}

return crc ^~ 0xFFFFFFFF;
}

我这样称呼它

 QString test= QString::number(mclass.crc32(0, crcval, 6))

1 个答案:

答案 0 :(得分:2)

从聊天讨论中提取的解决方案

正在实施的CRC-32算法是 CRC-32以太网(生成多项式0x04C11DB7)。

此CRC-32要求:

  • 使用0xFFFFFFFF初始化。
  • 由XORing与0xFFFFFFFF最终确定。

因此,您应该删除函数中的crc ^~ 0xFFFFFFFF语句,在调用函数时传递0xFFFFFFFF,并且在对数据进行CRC校验后,应该将返回值与{ {1}}。