我需要一个脚本来计算crc32,同时为Python和C提供相同的输出
我现在正在使用zlib.crc32,但是对于C来说没有这样的库,我们是基于Wikipedia自己编写的。但它不返回相同的值。
这是我们的C脚本代码(从维基百科复制,基于RFC):
unsigned int crc32( unsigned char *message, unsigned int n )
{
//int i, crc;
unsigned int crc;
unsigned int i;
unsigned int byte, c;
const unsigned int g0 = 0xEDB88320, g1 = g0>>1,
g2 = g0>>2, g3 = g0>>3, g4 = g0>>4, g5 = g0>>5,
g6 = (g0>>6)^g0, g7 = ((g0>>6)^g0)>>1;
i = 0;
crc = 0xFFFFFFFF;
//while ((byte = message[i]) != 0)
while( i != n)
{
byte = message[i]; // Get next byte.
// byte = FrmReadByte( i ); // Get next byte.
crc = crc ^ byte;
c = ((crc<<31>>31) & g7) ^ ((crc<<30>>31) & g6) ^
((crc<<29>>31) & g5) ^ ((crc<<28>>31) & g4) ^
((crc<<27>>31) & g3) ^ ((crc<<26>>31) & g2) ^
((crc<<25>>31) & g1) ^ ((crc<<24>>31) & g0);
crc = ((unsigned)crc >> 8) ^ c;
i = i + 1;
}
return ~crc;
}
编辑:
我们只有4KB的内存,程序本身并不存在。crc32脚本占用1KB内存可能太多,不适合那里。 感谢您指出ZLIB库也适用于C。
嗯,是的,有。它叫zlib。zlib是用C编写的,Python正在使用它!因此是类的名称。
您可以在zlib中使用
crc32()
函数。这个实现比您可能发现的其他实现要快一点。有关接口信息,请阅读zlib.h。您可以自己编译zlib,或者它可能已经安装在您的系统上。
更新:
我现在看到你的评论(应该编辑成这个问题,因为这是获得正确答案的关键),你的记忆非常有限。然后您可以使用:
crc最初设置为零。
使用
~
将给出正确的结果,因为stdint.h
中的uint32_t
类型保证为32位。如果您能够提供更多的代码空间,那么展开循环可能会加快速度(如果编译器还没有这样做):
你说你只有4千字节的“内存”。这只是程序的工作内存,还是程序也必须存在于其中?例如,如果flash中有更多的代码空间,那么可以预先计算表并将其与代码一起存储。表驱动的CRC将快得多。zlib代码提供表驱动的crc,它们一次执行一个字节,一次执行四个字节,分别需要一个1Kbyte或4Kbyte表。
更新2:
由于您在注释中回答4KBytes只是工作内存,那么您应该使用表驱动的CRC。您可以简单地使用zlib的
crc32.c
中的crc32()
函数和crc32.h
中未定义BYFOUR
的表。C:
Python:
由于您需要一个不使用查找表(大多数实现都是这样)的C实现和一个匹配的Python等价物,因此可以使用Mark Ransom(binasci.CRC32)
建议的ZIP的CRC32和我借用的匹配的无表实现here编辑:正如一些人指出的,上面的代码有问题,下面的代码与Wikipedia(参见http://ideone.com/pWLVSo)和Python(参见http://ideone.com/SvYuyE-1277644989==0x4c2750bd)匹配。这段代码来自this page,在这里,我复制的基本版本的其他实现和可能的改进
相关问题 更多 >
编程相关推荐