Python如何计算CRC32匹配在线结果?
How to calculate CRC32 with Python to match online results?
我正在尝试 calculate/generate 使用 Python 一些随机字符串的 CRC32 散列,但它们与我从在线资源生成的值不匹配。这是我在我的电脑上所做的,
>>> import binascii
>>> binascii.crc32('hello-world')
-1311505829
另一种方法,
>>> import zlib
>>> zlib.crc32('hello-world')
-1311505829
以上结果相同的事实告诉我,我调用的函数是正确的。但是,如果我访问以下在线资源,
- http://www.lammertbies.nl/comm/info/crc-calculation.html
- http://crc32-checksum.waraxe.us/
- http://www.md5calc.com/(select CRC32B 来自下拉列表)
对于字符串"hello-world"他们都给出相同的值=b1d4025b
有人知道我需要做什么才能获得匹配结果吗?
当我输入这个问题时,我突然想到我可能需要将 Python 结果转换为十六进制,
>>> hex(zlib.crc32('hello-world'))
'-0x4e2bfda5'
不幸的是,这也没有帮助。 :(
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 建议使用以下方法 "to generate the same numeric value across all Python versions and platforms".
import zlib
hex(zlib.crc32(b'hello-world') & 0xffffffff)
结果0xb1d4025b
符合预期。
似乎 python 返回的是有符号整数(因此是负数),而其他的返回的是无符号整数。
我试过使用 2^32 的模数,它给出了与这些网站相同的值。
>>> hex(zlib.crc32(b'hello-world')% 2**32)
'0xb1d4025b'
我正在尝试 calculate/generate 使用 Python 一些随机字符串的 CRC32 散列,但它们与我从在线资源生成的值不匹配。这是我在我的电脑上所做的,
>>> import binascii
>>> binascii.crc32('hello-world')
-1311505829
另一种方法,
>>> import zlib
>>> zlib.crc32('hello-world')
-1311505829
以上结果相同的事实告诉我,我调用的函数是正确的。但是,如果我访问以下在线资源,
- http://www.lammertbies.nl/comm/info/crc-calculation.html
- http://crc32-checksum.waraxe.us/
- http://www.md5calc.com/(select CRC32B 来自下拉列表)
对于字符串"hello-world"他们都给出相同的值=b1d4025b
有人知道我需要做什么才能获得匹配结果吗?
当我输入这个问题时,我突然想到我可能需要将 Python 结果转换为十六进制,
>>> hex(zlib.crc32('hello-world'))
'-0x4e2bfda5'
不幸的是,这也没有帮助。 :(
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 建议使用以下方法 "to generate the same numeric value across all Python versions and platforms".
import zlib
hex(zlib.crc32(b'hello-world') & 0xffffffff)
结果0xb1d4025b
符合预期。
似乎 python 返回的是有符号整数(因此是负数),而其他的返回的是无符号整数。
我试过使用 2^32 的模数,它给出了与这些网站相同的值。
>>> hex(zlib.crc32(b'hello-world')% 2**32)
'0xb1d4025b'