1

このコードは同じ出力を 3 回提供すると思いますが、そうではありません。

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 が続きます。(2番目の問題は、これが機能したとしても、スペースを置き換えるため、最初のものは変換されないことです).

一番下の\\xc0の\\でpythonが言っているのは、「これは通常のスラッシュです」です。

于 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()ディートリッヒ・エップが示すように使用する方がエレガントな私見ですが

于 2012-10-16T10:17:46.683 に答える