Я вызываю две функции на моем 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
Почему значения контрольных сумм в одних и тех же строках разные?
Похоже, кого-то беспокоит тот факт, что стандарт 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()
также.
Других решений пока нет …