LINUX.ORG.RU

как обычно вычисляют crc32 на C?


0

0

Есть какая-нибудь общепринятая библиотека для вычисления суммы crc32 или общедоступный кусок кода, который можно сделать copy/paste в любую программу? Нашел несколько вариантов в разных местах, но не уверен, какой из них оптимальнее/правильнее работает - хочется чего-нибудь стандартного. Язык - С.

★★★★★

пользуюсь этим:

unsigned long crc_table[256];

void crc_init()
{
        unsigned long t;
        for(int i=0;i<256;i++)
        {
                t=i;
                for(int j=8;j>0;j--)
                {
                        if(t&1)
                                t=(t>>1)^0xedb88320;
                        else
                                t>>=1;
                }
                crc_table[i] = t;
        }
}

unsigned long crc_cycle(unsigned long crc32, unsigned char * buf, ssize_t cnt)
{
        crc32=~crc32;
        for(ssize_t i=0;i<cnt;i++)
        {
                crc32=crc_table[(crc32^buf[i])&0xff]^(crc32>>8);
        }
        crc32=~crc32;
        return crc32;
}

int nain()
{
...
        crc_init();
        unsigned long crc=0;
        for(i=0;i<l;i+=ok)
        {
                ok=read(fd,buf,sizeof(buf));
                crc=crc_cycle(crc,buf,ok);
        }
        printf("%08lX\n",crc);
...
}

anonymous
()

А как необычно вычисляют? :)

Ay49Mihas ★★★★
()

Обычно вычисляют md5.

svr4
()

Дело в стандарте. Нужно просто определиться с полиномом, по которому строится сумма. Используется нечто 1^31+1^30+1^1+1^0. Для тех, кто не в курсе -- это будет 32-битное число :)

PS: Сам когда-то тоже интересовался этим вопросом. Никак не мог найти нужный полином в описаниях. Потом просто выдрал код из ядра (lib/crc32.c) :))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.