Python查找字符串的CRC32

8
我尝试获取字符串数据类型变量的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!')来完成,但我想知道如何针对字符串数据类型变量进行操作。

2个回答

19

当您计算某些数据的 crc32 时,您需要知道您正在哈希的字节的确切值。一个字符串可以用不同的编码表示不同的字节值,因此将字符串作为参数传递是含糊的。

使用 binascii.crc32(b'hello world!') 时,您将使用简单的 ASCII 表将字符数组转换为字节数组。

要转换任何字符串,您可以使用:

import binascii

text = 'hello'
binascii.crc32(text.encode('utf8'))

6

可以使用binascii.crc32zlib.crc32来完成此操作。本答案在 Tomas 的 答案基础上增加了两个模块的文档说明,并输出字符串,而不仅仅是整数。


# Define data
> text = "hello"
> data = text.encode()
> data
b'hello'

# Using binascii
> import binascii
> crc32 = binascii.crc32(data)
> crc32
907060870
> hex(crc32)
'0x3610a686'
> f'{crc32:#010x}'
'0x3610a686'

# Using zlib
> import zlib
> zlib.crc32(data)
907060870  # Works the same as binascii.crc32.

如果您不想让字符串输出带有 0x 前缀:

<code>> import base64
> crc32 = 907060870
> digest = crc32.to_bytes(4, 'big')
> digest
b'6\x10\xa6\x86'
> base64.b16encode(digest).decode().lower()
'3610a686'
</code>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接