Где я ошибаюсь, в описании алгоритма crc32/BZIP2?

В общем долгое время уже мучаюсь с проблемой описания данного алгоритма, о котором из википедии вычерпал все знания. Знаю что есть готовые реализации алгоритма(которые генерируют сначала массив-таблицу), но хотелось бы понимать суть процесса без трюков для увеличения скорости вычислений и не перебирая кучу кода а просто, прочитав словесное описание. Данный вариант нахождения 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);
}
  • Вопрос задан
  • 444 просмотра
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Руководство по которому я изучал CRC, реально клёвое: www.ross.net/crc/download/crc_v3.txt
Обычно путаница возникает с представлением данных (big/little endian) и тем, с какой стороны считать биты.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы