我在Python和C中尝试使用crc32算法,但我的结果不匹配。
C:
#include <stdio.h>
#include <stdlib.h>
#include <zlib.h>
#define NUM_BYTES 9
int
main(void)
{
uint8_t bytes[NUM_BYTES] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
uint32_t crc = crc32(0L, Z_NULL, 0);
for (int i = 0; i < NUM_BYTES; ++i) {
crc = crc32(crc, bytes, 1);
}
printf("CRC32 value is: %" PRIu32 "\n", crc);
}
输出为 CRC32 值为:3136421207
Python
In [1]: import zlib
In [2]: int(zlib.crc32("123456789") + 2**32)
Out[2]: 3421780262
在Python中,我使用2 ** 32进行“强制转换”为无符号整数。
我错过了什么?
[编辑1]
现在我尝试使用
In [8]: crc = 0;
In [9]: for i in xrange(1,10):
...: crc = zlib.crc32(str(i), crc)
...:
In [10]: crc
Out[10]: -873187034
In [11]: crc+2**32
Out[11]: 3421780262
并且
int
main(void)
{
uint32_t value = 123456789L;
uint32_t crc = crc32(0L, Z_NULL, 0);
crc = crc32(crc, &value, 4);
printf("CRC32 value is: %" PRIu32 "\n", crc);
}
仍然没有获得相同的结果。
gcc -std=c99 -lz -o crctest test.c
出现了undefined references
错误,应该改为gcc -std=c99 -o crctest test.c -lz
。 - rkta