gpt4 book ai didi

python - Python 和 C 使用相同的 crc32

转载 作者:行者123 更新时间:2023-11-28 19:34:17 25 4
gpt4 key购买 nike

我需要脚本来为 Python 和 C 计算具有相同输出的 crc32。

我现在用的是zlib.crc32,但是对于C没有这样的库,我们是根据维基百科自己写的。但它不会返回相同的值。

这是我们的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 的 ram 内存,程序本身并不存在。 crc32 脚本占用 1KB 的内存可能太多了,放不下。感谢您指出 ZLIB 库也适用于 C。

最佳答案

I'm using right now zlib.crc32, but for C there is no such library

嗯,是的,有。它叫做zlib . zlib 是用 C 语言编写的,而 Python 正在使用它!因此类的名称。

您可以使用 zlib 中的 crc32() 函数。该实现比您可能发现的其他实现要快一些。阅读zlib.h获取接口(interface)信息。

您可以自己编译 zlib,或者它可能已经安装在您的系统上。

更新:

我现在看到您的评论(应该将其编辑到问题中,因为它对于获得正确答案至关重要)您的内存极其有限。然后你可以使用这个:

static uint32_t crc32(uint32_t crc, unsigned char *buf, size_t len)
{
int k;

crc = ~crc;
while (len--) {
crc ^= *buf++;
for (k = 0; k < 8; k++)
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
}
return ~crc;
}

crc 初始设置为零。

~ 的使用将给出正确的结果,因为 stdint.h 中的 uint32_t 类型确保为 32 位。

如果您能负担得起更多的代码空间,那么展开循环可能会加快速度(如果编译器尚未这样做):

static uint32_t crc32(uint32_t crc, unsigned char *buf, size_t len)
{
crc = ~crc;
while (len--) {
crc ^= *buf++;
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
}
return ~crc;
}

你说你只有 4 KB 的“内存”。那只是程序的工作内存,还是程序也必须住在那里?例如,如果您在闪存中有更多空间用于代码,则可以预先计算该表并将其与代码一起存储。表驱动的 CRC 会快得多。 zlib 代码提供表驱动的 CRC,一次执行一个字节和一次执行四个字节,分别需要 1Kbyte 或 4Kbyte 的表。

更新 2:

既然您在评论中回答说 4KBytes 只是工作内存,那么您应该使用表驱动的 CRC。您可以简单地使用 zlib 的 crc32.c 中的 crc32() 函数和带有 BYFOURcrc32.h 中的表> 未定义。

关于python - Python 和 C 使用相同的 crc32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15030011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com