gpt4 book ai didi

python - C zlib crc32 和 Python zlib crc32 不匹配

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:04 33 4
gpt4 key购买 nike

我在 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);
}

还是不一样的结果。

最佳答案

您的原始 C 和 Python 代码片段中存在问题。至于你的第二个 C 代码片段,我没有尝试编译它,但它不可移植,因为 int 中的字节顺序是平台相关的。因此它会根据 CPU 的 endianness 给出不同的结果。

正如 Serge Ballesta 提到的,一个问题是 {1, 2, 3, 4, 5, 6, 7, 8, 9}{'1' , '2', '3', '4', '5', '6', '7', '8', '9'。另一个问题是原始 C 代码中的循环实际上并未扫描数据,因为您没有在循环中使用 i,如 bav 所述。

crctest.c

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <zlib.h>

#define NUM_BYTES 9

// gcc -std=c99 -lz -o crctest test.c

void do_crc(uint8_t *bytes)
{
uint32_t crc = crc32(0L, Z_NULL, 0);

for (int i = 0; i < NUM_BYTES; ++i)
{
crc = crc32(crc, bytes + i, 1);
}

printf("CRC32 value is: %lu\n", crc);
}

int main(void)
{
uint8_t bytes0[NUM_BYTES] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
uint8_t bytes1[NUM_BYTES] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};

do_crc(bytes0);
do_crc(bytes1);
}

输出

CRC32 value is: 1089448862
CRC32 value is: 3421780262

crctest.py

#! /usr/bin/env python

import zlib

def do_crc(s):
n = zlib.crc32(s)
return n + (1<<32) if n < 0 else n

s = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09'
print `s`, do_crc(s)

s = b'123456789'
print `s`, do_crc(s)

输出

'\x01\x02\x03\x04\x05\x06\x07\x08\t' 1089448862
'123456789' 3421780262

编辑

这是在 Python 中处理转换的更好方法:

def do_crc(s):
n = zlib.crc32(s)
return n & 0xffffffff

有关此主题的更多信息,请参阅此处的答案:How to convert signed to unsigned integer in python

关于python - C zlib crc32 和 Python zlib crc32 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28039861/

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