2016-10-19 8 views
0

Я нашел простую в использовании реализацию CRC-алгоритмов here. Он включает в себя табличные и битовые алгоритмы. Код, похоже, работает нормально, но существует важное ограничение алгоритмов на основе таблиц. Это соответствующий код:Алгоритм таблицы CRC в C, ограничение ширины

unsigned long reflect (unsigned long crc, int bitnum) { 
    unsigned long i, j=1, crcout=0; 

    for (i=(unsigned long)1<<(bitnum-1); i; i>>=1) { 
     if (crc & i) crcout|=j; 
     j<<= 1; 
    } 
    return (crcout); 
} 

void generate_crc_table() { 
    // make CRC lookup table used by table algorithms 

    int i, j; 
    unsigned long bit, crc; 

    for (i=0; i<256; i++) { 
     crc=(unsigned long)i; 
     if (refin) crc=reflect(crc, 8); 
     crc<<= order-8; 

     for (j=0; j<8; j++) { 
      bit = crc & crchighbit; 
      crc<<= 1; 
      if (bit) crc^= polynom; 
     }   

     if (refin) crc = reflect(crc, order); 
     crc&= crcmask; 
     crctab[i]= crc; 
    } 
} 

unsigned long crctablefast (unsigned char* p, unsigned long len) { 

    // fast lookup table algorithm without augmented zero bytes, e.g. used in pkzip. 
    // only usable with polynom orders of 8, 16, 24 or 32. 

    unsigned long crc = crcinit_direct; 

    if (refin) crc = reflect(crc, order); 

    if (!refin) while (len--) crc = (crc << 8)^crctab[ ((crc >> (order-8)) & 0xff)^*p++]; 
    else while (len--) crc = (crc >> 8)^crctab[ (crc & 0xff)^*p++]; 

    if (refout^refin) crc = reflect(crc, order); 
    crc^= crcxor; 
    crc&= crcmask; 

    return(crc); 
} 

Пожалуйста, обратите внимание, комментарии коды для функций таблицы говорит:

может использоваться только с Полиномом порядками 8, 16, 24 или 32.

ли таблица основанные на алгоритмах, обычно ограниченные ширинами, кратными восьми (особенно табличные алгоритмы, использующие таблицы 16 и 32 бит)?

Возможно ли реализовать алгоритм CRC на основе таблицы, который принимает любой Ширина CRC (не только кратные 8)? Как?

+1

Не мой нисходящий сигнал. Но вопрос должен быть самодостаточным, т. Е. Любой вопрос, относящийся к вопросу, должен быть в самом вопросе. Ответ на ваш вопрос: «Да, вы можете использовать генераторный многочлен любого порядка с алгоритмом CRC на основе таблицы». Но чтобы объяснить комментарий, который вы указали, код должен быть в вопросе. – user3386109

+1

Конечно, код может быть записан для обработки CRC при значениях, отличных от кратных 8. 8 просто проще. Цель поста заключается в широком диапазоне, предполагают сужение. – chux

+0

@chux: сужение? Как? – Silicomancer

ответ

1

Да, вы можете реализовать табличные CRC для любого полинома ширины. См. Вывод crcany, например, о реализации на основе таблиц, например, для 5-битных, 13-битных и 31-битных CRC.

В этом нет ничего сложного.

+0

Спасибо. Очень интересный ваш код. Может быть, я пропустил это при просмотре файлов ... но почему код включает в себя битовую функцию? Есть ли что-нибудь, что битовая функция может делать то, что функции таблицы не могут? Или это только для тестирования? – Silicomancer

+1

Да. Для построения таблиц нужна битовая функция! Также, если вы хотите вычислить CRC на нескольких битах, которые не являются кратным восьми, вы можете адаптировать бит-мудрую функцию для этого. Наконец, во встроенной системе компактность функции CRC может быть более важной, чем скорость. –

+0

С «кратным восьми» вы подразумеваете ширину данных, а не ширину контрольной суммы, правильно? – Silicomancer