У меня есть довольно простая программа для вычисления 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.
Любая помощь с этим была бы весьма признательна. Спасибо.
Zlib использует любой алгоритм CRC, который он выбирает для реализации. Если вам нужен другой алгоритм, вам нужно будет использовать другую реализацию. Если вам нужен конкретный алгоритм, вам нужно убедиться, что реализация использует этот конкретный алгоритм. –
Существует, по меньшей мере, пять различных многочленов CRC32 в относительно распространенном использовании, и если вы добавите к этим различным схемам для заполнения и endianess, возможно, 10-20 различных способов получить «crc32» на идентичном блоке данных. –
'unsigned long' не гарантируется 32-разрядный тип. Используется для типов фиксированной ширины 'stdint.h' (и для печати макросов из' inttypes.h'). – Olaf