Python中使用十六进制输入的CRC32校验和

4
我想在Python中计算十六进制字符串的CRC32校验和。我找到了zlib.crc32(data)和binascii.crc32(data),但是我发现所有使用这些函数的示例都将"data"作为字符串(例如"hello")。我想将十六进制值作为数据传入并查找校验和。我尝试将数据设置为十六进制值(例如0x18329a7e),但是我收到一个TypeError:必须是字符串或缓冲区,而不是整数。当我将十六进制值设置为字符串(例如“0x18329a7e”)时,该函数会计算,但我不认为它正在计算正确的校验和。感谢您的帮助!

你所谓的“传递十六进制值”是什么意思?你是否意识到十六进制只是人类使用的数字表示法,而CRC32适用于二进制数据?不清楚你想要做什么:计算包含十六进制字符的字符串的CRC32,还是计算在软件中某个位置表示为十六进制值的某些二进制数据的CRC32。 - Juliano
我想计算一些二进制数据的CRC32值,这些数据恰好在我的软件中以十六进制值表示。 - dmranck
那么 Andrew 的答案就可以了。 - Juliano
3个回答

12

我想你正在寻找binascii.a2b_hex()

>>> binascii.crc32(binascii.a2b_hex('18329a7e'))
-1357533383

1
谢谢!这正是我需要的。结果与在线CRC计算器(http://www.lammertbies.nl/comm/info/crc-calculation.html)相匹配。我在最初的问题中没有指定,但我也希望输出为8个十六进制值的字符串。如果有人想知道,以下代码可以正确格式化输出:'%08X' % (binascii.crc32(binascii.a2b_hex('18329a7e')) & 0xffffffff)再次感谢您的帮助! - dmranck

1
>>> import struct,binascii
>>> ncrc = lambda numVal: binascii.crc32(struct.pack('!I', numVal))
>>> ncrc(0x18329a7e)
-1357533383

0
尝试将十六进制值列表转换为字符串:
t = ['\x18', '\x32', '\x9a', '\x7e']
chksum = binascii.crc32(str(t))

1
我怀疑他不想像这样将列表转换为字符串。用binascii.crc32(''.join(t))替换你的第二行代码会得到与phihag答案相同的结果。 - miles82

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