CRC32 не рассчитан правильно

Я использую очень простой алгоритм для вычисления CRC32, но он дает неправильные значения.

Я сравниваю свои выходные значения с калькулятор те, но это всегда выглядит по-другому

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))

3

Решение

Решение, полученное из обсуждения в чате

Реализуемый алгоритм CRC-32 CRC-32 Ethernet (генератор полинома 0x04C11DB7).

Этот CRC-32 требует:

  • Инициализируется с 0xFFFFFFFF,
  • И завершается XORing с 0xFFFFFFFF,

Поэтому вы должны удалить crc ^~ 0xFFFFFFFF заявления в вашей функции, передать 0xFFFFFFFF при вызове функции и после завершения CRCing данных вы должны XOR вернуть значение 0xFFFFFFFF,

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector