如何使用Python计算CRC32以匹配联机结果?

2024-06-08 04:42:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python计算/生成一些随机字符串的CRC32散列,但它们与我从在线源生成的值不匹配。这是我在电脑上做的事情

>>> import binascii
>>> binascii.crc32('hello-world')
-1311505829

另一种方法

>>> import zlib
>>> zlib.crc32('hello-world')
-1311505829

上述结果相同的事实告诉我,我正确地调用了函数。但是,如果我访问以下在线资源

对于字符串“hello world”,它们都给出相同的值=b1d4025b

有人知道我需要做什么才能得到匹配的结果吗?

当我输入这个问题时,我突然想到我可能需要将Python结果转换成hex

>>> hex(zlib.crc32('hello-world'))
'-0x4e2bfda5'

不幸的是,这也没有帮助。:(一)


Tags: 方法字符串importhttphelloworldwww事情
3条回答

python似乎返回了一个有符号整数(因此是负数),而其他的python则返回了一个无符号整数。

我试过用一个2^32的模数,它给出的值和这些站点的值相同。

>>> hex(zlib.crc32(b'hello-world')% 2**32)
'0xb1d4025b'

Python 2(与py3不同)正在执行有符号的32位CRC。

这些站点正在执行无符号的32位CRC。

否则,这些值是相同的,您可以从中看到:

>>> 0x100000000 - 0xb1d4025b == 0x4e2bfda5
True

从32位有符号转换为32位无符号的一种快速方法是:*

>>> -1311505829 % (1<<32)
2983461467

或十六进制:

>>> hex(-1311505829 % (1<<32))
'0xb1d4025b'

& 0xFFFFFFFF% 0x100000000& (2**32-1)% (2**32)等都是做同一个位旋转的等效方法;归根结底,你觉得哪个最可读。


*这只适用于进行整数除法的语言,如Python(-3 // 2 == -2);而对于进行截断整数除法的语言,如Java(-3 / 2 == -1),最终仍然会得到负数。在不需要除法和mod的语言中,比如C,所有的下注都是关闭的,但是在C中,你只需将字节转换成你想要的类型即可…

zlib.crc32 documentation建议使用以下方法“在所有Python版本和平台上生成相同的数值”。

import zlib
hex(zlib.crc32(b'hello-world') & 0xffffffff)

结果是0xb1d4025b如预期。

相关问题 更多 >

    热门问题