В общем долгое время уже мучаюсь с проблемой описания данного алгоритма, о котором из википедии вычерпал все знания. Знаю что есть готовые реализации алгоритма(которые генерируют сначала массив-таблицу), но хотелось бы понимать суть процесса без трюков для увеличения скорости вычислений и не перебирая кучу кода а просто, прочитав словесное описание. Данный вариант нахождения crc32 я выбрал из-за отсутствие инверсии битов и как следствие, наиболее удобного для понимая теории, но как я не старался, crc берет свое), даже близко не совпадает контрольная сумма с представленной в вики-таблице для строки "123456789") Вот параметры:
width:32
poly:0x4C11DB7
init:0xFFFFFFFF
RefIn:false
RefOut:false
XorOut:0xFFFFFFFF
check:"123456789"
(результат из википедии):ch=0xFC891918;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdint.h>
//#include<netinet/in.h>
#define COUNT_MASS 9
uint8_t mass[COUNT_MASS];
//proto
uint32_t crc(uint8_t*,uint32_t);
//
uint32_t crc(uint8_t *m,uint32_t dl)
{
uint32_t poly=0x4c11db7;
uint32_t dl_0=dl+4;
int i,i_0;
char flags;
uint32_t *p;//регистр
uint8_t *mas=(uint8_t*)malloc(dl+8);//копируем полученный массив в качестве параметра ф и дополняем
//32 единичными битами в начале и 32 нуливыми битами в хвосте массива
memset(mas,0,dl+8);
memset(mas,255,4);
memcpy(&mas[4],m,dl);
p=(uint32_t*)mas;
for(i=0;i<(dl+4)*8;i++){
flags=0;
if(i!=0 & (i%8)==0){
--dl_0;
}
for(i_0=0;i_0<dl_0;i_0++){
if(mas[i_0]>127 & i_0==0){
flags=1;
}
mas[i_0]<<=1;
if(mas[i_0+1]>127){
++mas[i_0];
}
}
if(flags==1){
*p^=poly;
}
}
return *p^=0xFFFFFFFF;
}
int main()
{
//poly=79764919;0000|0100||1100|0001||0001|1101||1011|0111;0x4c11db7
uint32_t b=0,ch=0xfc891918;
mass[0]='1';
mass[1]='2';
mass[2]='3';
mass[3]='4';
mass[4]='5';
mass[5]='6';
mass[6]='7';
mass[7]='8';
mass[8]='9';
b=crc(mass,COUNT_MASS);
printf("%u+++%u\n",ch,b);
}