2015-07-05 3 views
3

Я использую очень простой алгоритм для вычисления 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)) 
+0

Помимо любых реальных проблем, которые могут иметь или не иметь ваш код, что именно делает '^ ~ 0xFFFFFFFF'? –

+0

На самом деле этот шаг не влияет, как если бы бит с нулевым значением оставался 0, и если он останется таким же, как и – tulipe

+1

Это была именно моя точка. Вы XORing с дополнением к all-ones, что является абсолютно нулевым, то есть вы ничего не делаете. Если вы намеревались дополнить биты, вы должны использовать 'x = ~ x;'. Что касается остальной части вашего кода, уверены ли вы, что он не вычисляет результат с битальным обращением? Использование правого полинома (CRC-32/Ethernet против CRC-32C/Castagnoli)? –

ответ

2

Решение, взятое из чата dicussion

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

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

  • инициализируется с 0xFFFFFFFF.
  • И заканчивается XORing с 0xFFFFFFFF.

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