Я нашел простую в использовании реализацию 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)? Как?
Не мой нисходящий сигнал. Но вопрос должен быть самодостаточным, т. Е. Любой вопрос, относящийся к вопросу, должен быть в самом вопросе. Ответ на ваш вопрос: «Да, вы можете использовать генераторный многочлен любого порядка с алгоритмом CRC на основе таблицы». Но чтобы объяснить комментарий, который вы указали, код должен быть в вопросе. – user3386109
Конечно, код может быть записан для обработки CRC при значениях, отличных от кратных 8. 8 просто проще. Цель поста заключается в широком диапазоне, предполагают сужение. – chux
@chux: сужение? Как? – Silicomancer