CRC32 计算不对
CRC32 not calculated right
我使用了一个非常简单的算法来计算 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,
.........,..............,.............,.........,...........
};
使用查找的函数 table 是
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))
从聊天讨论中得出的解决方案
正在实施的 CRC-32 算法是 CRC-32 以太网(生成多项式 0x04C11DB7
)。
此 CRC-32 要求:
- 正在用
0xFFFFFFFF
初始化。
- 并通过与
0xFFFFFFFF
的 XORing 最终确定。
因此,您应该删除函数中的 crc ^~ 0xFFFFFFFF
语句,在调用该函数时传递 0xFFFFFFFF
,一旦完成 CRC 数据,您应该对 return 值与 0xFFFFFFFF
.
我使用了一个非常简单的算法来计算 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,
.........,..............,.............,.........,...........
};
使用查找的函数 table 是
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))
从聊天讨论中得出的解决方案
正在实施的 CRC-32 算法是 CRC-32 以太网(生成多项式 0x04C11DB7
)。
此 CRC-32 要求:
- 正在用
0xFFFFFFFF
初始化。 - 并通过与
0xFFFFFFFF
的 XORing 最终确定。
因此,您应该删除函数中的 crc ^~ 0xFFFFFFFF
语句,在调用该函数时传递 0xFFFFFFFF
,一旦完成 CRC 数据,您应该对 return 值与 0xFFFFFFFF
.