Разница между реализациями crc32 () в & lt; linux / crc32.h & gt; и & lt; zlib.h & gt; в С

Я вызываю две функции на моем char* s = "pratik" как:

Код пользователя:

#include <zlib.h>
int main()
{
char *s = "pratik";
printf("%x\n",crc32(0x80000000, s, strlen(s)));
return 0;
}

Выход:
66fa3c99

Код ядра:

#include <linux/crc32.h>

int main()
{
char *s = "pratik";

u32 checksum = crc32(0x80000000, s, strlen(s));
printk("\nChecksum --> %x", checksum);

return checksum;
}

Выход:

Контрольная сумма -> d7389d3a

Почему значения контрольных сумм в одних и тех же строках разные?

6

Решение

Похоже, кого-то беспокоит тот факт, что стандарт Ethernet (PKZIP, ITU V.42 и т. Д. И т. Д.) CRC-32 выполняет пред- и пост-эксклюзивный-или 0xffffffff, Таким образом, версия в ядре Linux исключает это и ожидает, что приложение сделает это. Пойди разберись.

В любом случае, вы можете получить тот же результат, что и (правильный) zlib crc32(), используя (нестандартный) Linux crc32() вместо этого, таким образом:

crc_final = crc32(crc_initial ^ 0xffffffff, buf, len) ^ 0xffffffff;

Фактически, тот же самый код позволит вам дублировать Linux crc32() используя zlib crc32() также.

9

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector