1

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

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!

请解释!

4

3 回答 3

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))
于 2012-10-16T10:17:17.050 回答
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 中使用 \\ 说的是“这是一个普通的斜线”。

于 2012-10-16T10:14:39.420 回答
0

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

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

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

于 2012-10-16T10:17:46.683 回答