2011-04-05 162 views
4

我想计算python中十六进制值的字符串的CRC32校验和。我发现了zlib.crc32(data)和binascii.crc32(data),但是我发现使用这些函数的所有例子都有'data'作为字符串(例如'hello')。我想传递十六进制值作为数据并找到校验和。我试图设置数据为十六进制值(例如0x18329a7e),我得到一个TypeError:必须是字符串或缓冲区,而不是int。该函数评估当我使十六进制值为一个字符串(例如'0x18329a7e'),但我不认为它正在评估正确的校验和。任何帮助,将不胜感激。谢谢!使用十六进制输入的Python中的CRC32校验和

+0

正是你的“传递十六进制值”意味着什么?您是否意识到十六进制只是人类的数字表示,而CRC32适用于二进制数据?目前尚不清楚你到底想要做什么:计算包含十六进制字符的字符串的CRC32,或者在软件中某处出现的十六进制值的二进制数据。 – Juliano 2011-04-05 19:42:11

+0

我想计算一些二进制数据的CRC32,这些数据在我的软件中恰好被表示为十六进制值。 – dmranck 2011-04-05 19:51:49

+0

然后,安德鲁的回答就是这样。 – Juliano 2011-04-05 20:00:50

回答

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 2011-04-05 20:05:56

0

尝试十六进制值的列表转换为字符串:

t = ['\x18', '\x32', '\x9a', '\x7e'] 
chksum = binascii.crc32(str(t)) 
+1

我怀疑他想将列表转换为像这样的字符串。用binascii.crc32替换你的第二行(''。join(t))给出与phihag的答案相同的结果。 – miles82 2011-04-05 19:53:00

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