2012-10-16 45 views
1

我要說的是,這個代碼將提供相同的輸出3次,但它並不:爲什麼python的這個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! 

請解釋!

回答

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)) 
+0

好想起了'b16decode' + 1 –

1

一旦你把它變成蟒控制檯和看數據的問題被披露:

>>> 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' 

的主要問題是,你的第一個好串放literaly的\ X符號考慮它,而它被翻譯 - \ xbla具有特殊含義,當您輸入字符串時會被翻譯,在字符串中使用斜槓後跟x是斜線,後跟x。 (第二個問題是,即使這個工作,因爲你替換空間,第一個不會被轉換)。

python在底部\\ xc0 \ \中說的是「這是一個正常的斜線」。

0

什麼喬說是正確的 - 所以我就不再重複了。要正確地轉換您輸入的字符串,可以使用以下命令:

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

編輯:雖然如圖迪特里希EPP使用base64.b16decode()更優雅恕我直言,