Python 查找字符串的 CRC32
Python find CRC32 of string
我试图获取字符串数据类型变量的 crc32,但出现以下错误。
>>> message='hello world!'
>>> import binascii
>>> binascii.crc32(message)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'
对于字符串值,可以使用 binascii.crc32(b'hello world!')
完成,但我想知道如何对字符串数据类型变量执行此操作
当您计算某些数据的 crc32 时,您需要知道您正在散列的字节的确切值。一个字符串可以表示不同编码的不同字节值,因此将字符串作为参数传递是不明确的。
当使用 binascii.crc32(b'hello world!')
时,您使用简单的 ascii table 作为转换将 char 数组转换为字节数组。
要转换任何字符串,您可以使用:
import binascii
text = 'hello'
binascii.crc32(text.encode('utf8'))
这可以使用 binascii.crc32
or zlib.crc32
. This answer improves upon the prior 来完成,方法是记录两个模块,使用 & 0xffffffff
获得可重现的输出,以及生成除整数之外的字符串输出。
> import binascii, zlib
# Define data
> text = "hello"
> data = text.encode()
> data
b'hello'
# Using binascii
> crc32 = binascii.crc32(data) & 0xffffffff # Must use "& 0xffffffff" as per docs.
> crc32
907060870
> hex(crc32)
'0x3610a686'
> f'{crc32:#010x}'
'0x3610a686'
# Using zlib
> zlib.crc32(data) & 0xffffffff # Must use "& 0xffffffff" as per docs.
907060870 # Works the same as binascii.crc32.
# In one line:
> hex(binascii.crc32(text.encode()) & 0xffffffff)
'0x3610a686'
我试图获取字符串数据类型变量的 crc32,但出现以下错误。
>>> message='hello world!'
>>> import binascii
>>> binascii.crc32(message)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'
对于字符串值,可以使用 binascii.crc32(b'hello world!')
完成,但我想知道如何对字符串数据类型变量执行此操作
当您计算某些数据的 crc32 时,您需要知道您正在散列的字节的确切值。一个字符串可以表示不同编码的不同字节值,因此将字符串作为参数传递是不明确的。
当使用 binascii.crc32(b'hello world!')
时,您使用简单的 ascii table 作为转换将 char 数组转换为字节数组。
要转换任何字符串,您可以使用:
import binascii
text = 'hello'
binascii.crc32(text.encode('utf8'))
这可以使用 binascii.crc32
or zlib.crc32
. This answer improves upon the prior & 0xffffffff
获得可重现的输出,以及生成除整数之外的字符串输出。
> import binascii, zlib
# Define data
> text = "hello"
> data = text.encode()
> data
b'hello'
# Using binascii
> crc32 = binascii.crc32(data) & 0xffffffff # Must use "& 0xffffffff" as per docs.
> crc32
907060870
> hex(crc32)
'0x3610a686'
> f'{crc32:#010x}'
'0x3610a686'
# Using zlib
> zlib.crc32(data) & 0xffffffff # Must use "& 0xffffffff" as per docs.
907060870 # Works the same as binascii.crc32.
# In one line:
> hex(binascii.crc32(text.encode()) & 0xffffffff)
'0x3610a686'