为什么在python中计算CRC16有区别?

时间:2012-10-16 10:07:01

标签: python crc crc16

我会说这段代码会提供相同的输出三次,但它不会:

import crcmod

#create CRC16 calculator
crc16 = crcmod.predefined.mkCrcFun('crc-16')

#wait for user input
#hstr = raw_input("enter hex commands, space separated: ")
hstr = '81 12 C0 00 01 05'
hex_series = hstr.replace(' ', '\\x')
hex_series_caps = hstr.capitalize().replace(' ', '\\x') #why is there difference?

print hex(crc16(hex_series))  # gives 0xd795 incorrect! + how can there be a 9???
print hex(crc16(hex_series_caps))  # gives 0x37b4 incorrect!
print hex(crc16('\x81\x12\xC0\x00\x01\x05')) # gives 0x815b correct!

请解释!

3 个答案:

答案 0 :(得分:4)

让我们打开一个Python提示符......

>>> hstr
'81 12 C0 00 01 05'
>>> hex_series
'81\\x12\\xC0\\x00\\x01\\x05'
>>> hex_series_caps
'81\\x12\\xc0\\x00\\x01\\x05'

如您所见,没有字符串是您想要的字符串。用"\\x"替换空格只需在字符串中插入一堆反斜杠和x个字符,它就不会进行任何转义。

'\x63'之类的转义序列将变为'c',但如果您在源代码中以这种方式编写,则仅 。在字符串操作,读取字符串或几乎任何其他内容后,转义序列。例如,

>>> '\x63'
'c'
>>> '\\' + 'x63'
'\\x63'

请改为尝试:

import base64
data = base64.b16decode(hstr.replace(' ', ''))
print hex(crc16(data))

答案 1 :(得分:1)

一旦你将它放入python控制台并查看数据,问题就会显现出来:

>>> good = '\x81\x12\xC0\x00\x01\x05'
>>> hstr = '81 12 C0 00 01 05'
>>> hex_series = hstr.replace(' ', '\\x')
>>> hex_series_caps = hstr.capitalize().replace(' ', '\\x')
>>> good
'\x81\x12\xc0\x00\x01\x05'
>>> hex_series
'81\\x12\\xC0\\x00\\x01\\x05'
>>> hex_series_caps
'81\\x12\\xc0\\x00\\x01\\x05'

主要的问题是你把文字中的\ x符号放入其中,而在第一个好的字符串中它被翻译 - \ xbla有特殊含义,当你输入字符串时会被翻译,在字符串中有斜线后跟x只是斜线跟着x。 (第二个问题是,即使这有效,因为你替换空格,第一个不会被转换)。

python在底部的\\ xc0中用\\说的是“这是正常的斜线”。

答案 2 :(得分:0)

乔所说的是正确的 - 所以我不会重复。要正确转换输入字符串,可以使用以下命令:

blah = ''.join(chr(int(c, 16)) for c in hstr.split())
# '\x81\x12\xc0\x00\x01\x05'

编辑虽然使用Dietrich Epp所示的base64.b16decode()更优雅恕我直言