2016-08-17 4 views
0

У меня есть довольно простая программа для вычисления CRC32 входных строк из stdin, и по какой-то причине я не получаю CRC32, а CRC32B.ZLIB, кажется, возвращает CRC32B не CRC32 в C

Вот мой код

int main(int argc, char *argv[]) { 

    unsigned long crc=0L; 
    unsigned char *stdinput = malloc(1024); 

    crc = crc32(0L, Z_NULL, 0); 

    fgets(stdinput, 1024, stdin); 

    crc = crc32(crc, stdinput, strlen(stdinput) - 1); 
    printf("%s 0x%08x\n", stdinput, crc); 

} 

Я знаю, что есть переполнения проблемы в программе, но это не обязательно мой вопрос.

Проблема в том, выход, как так

эхо-тест | ./crc32 приводит 0xd87f7e0c

и не 0xaccf8b33 Проверенный здесь https://www.tools4noobs.com/online_tools/hash/

Выход из Zlib, безусловно, используя CRC32B и не CRC32.

Как я могу изменить это, чтобы получить правильный результат?

Я запускаю это на 64-разрядной машине Debian.

Любая помощь с этим была бы весьма признательна. Спасибо.

+1

Zlib использует любой алгоритм CRC, который он выбирает для реализации. Если вам нужен другой алгоритм, вам нужно будет использовать другую реализацию. Если вам нужен конкретный алгоритм, вам нужно убедиться, что реализация использует этот конкретный алгоритм. –

+2

Существует, по меньшей мере, пять различных многочленов CRC32 в относительно распространенном использовании, и если вы добавите к этим различным схемам для заполнения и endianess, возможно, 10-20 различных способов получить «crc32» на идентичном блоке данных. –

+0

'unsigned long' не гарантируется 32-разрядный тип. Используется для типов фиксированной ширины 'stdint.h' (и для печати макросов из' inttypes.h'). – Olaf

ответ

1

Результаты, которые вы получаете от своего кода, верны.

Веб-сайт, на который вы ссылаетесь, использует (устаревшую) библиотеку mhash для ввода хэш-данных, whose "crc32" implementation uses an uncommon polynomial typically only used for Ethernet checksums. Хэш, реализованный mhash как «crc32b», на самом деле тот, который обычно называется CRC32.

+0

Знаете ли вы, что я могу получить рабочий код mhash для работы? Я продолжаю получать ошибки заголовка функций, не найденных в примере, который у меня есть. – TyrantUT

+0

Не используйте mhash. Он старый, багги и не обновляется с 2008 года. – duskwuff