2015-03-20 3 views
2

Я боролся с внутренними проблемами. В частности, я не получаю таких же результатов, используя стандартный расчет CRC и , предположительно, эквивалентных интеллектуальных возможностей. Я бы хотел перейти к использованию _mm_crc32_u16 и _mm_crc32_u32, но если я не могу получить 8-битную операцию, это не имеет смысла._mm_crc32_u8 дает отличный результат, чем код ссылки

static UINT32    g_ui32CRC32Table[256] = 
{ 
    0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL, 
    0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L, 
    0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L, 
.... 

// Your basic 32-bit CRC calculator 
// NOTE: this code cannot be changed 
UINT32 CalcCRC32(unsigned char *pucBuff, int iLen) 
{ 
    UINT32 crc = 0xFFFFFFFF; 

    for (int x = 0; x < iLen; x++) 
    { 
     crc = g_ui32CRC32Table[(crc^*pucBuff++) & 0xFFL]^(crc >> 8); 
    } 

    return crc^0xFFFFFFFF; 
} 


UINT32 CalcCRC32_Intrinsic(unsigned char *pucBuff, int iLen) 
{ 
    UINT32 crc = 0xFFFFFFFF; 

    for (int x = 0; x < iLen; x++) 
    { 
     crc = _mm_crc32_u8(crc, *pucBuff++); 
    } 
    return crc^0xFFFFFFFF; 
} 
+0

Можете ли вы привести пример того, как вы тестируете эти две функции и каков выход? –

+0

Марк Адлер ответил на вопрос. Спасибо, Марк. –

ответ

3

Эта таблица предназначена для другого полинома CRC, отличного от того, который используется инструкцией Intel. Таблица предназначена для Ethernet/ZIP/и т. Д. CRC, часто называемый CRC-32. В инструкции Intel используется многочлен iSCSI (Castagnoli), для CRC, часто называемый CRC-32C.

Этот короткий пример кода можно вычислить либо, раскомментировав желаемый полином:

#include <stddef.h> 
#include <stdint.h> 

/* CRC-32 (Ethernet, ZIP, etc.) polynomial in reversed bit order. */ 
#define POLY 0xedb88320 

/* CRC-32C (iSCSI) polynomial in reversed bit order. */ 
/* #define POLY 0x82f63b78 */ 

/* Compute CRC of buf[0..len-1] with initial CRC crc. This permits the 
    computation of a CRC by feeding this routine a chunk of the input data at a 
    time. The value of crc for the first chunk should be zero. */ 
uint32_t crc32c(uint32_t crc, const unsigned char *buf, size_t len) 
{ 
    int k; 

    crc = ~crc; 
    while (len--) { 
     crc ^= *buf++; 
     for (k = 0; k < 8; k++) 
      crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1; 
    } 
    return ~crc; 
} 

Вы можете использовать этот код, чтобы создать таблицу замены для вашего кода, просто вычисления CRC-32C каждого из одного -байтные сообщения 0, 1, 2, ..., 255.

+0

Спасибо. Это очень полезно. –

Смежные вопросы