2015-04-17 95 views
1

我在python 2.7中使用bytearrays來解析來自串口的數據流。我正面臨一個奇怪的行爲:我試圖計算接收數據包的校驗和以檢查其有效性,但是我在通過一個字節陣列發現sum()函數時遇到了問題。我會預料到,作爲一個字節數組的bytearray,它會將每個字節相加,對吧?只有它不..Bytearray sum in python

例如:我有這個包

str = '200a02daffe0fe3d140500f6fff6ff6df42c0aabfe' 
b = bytearray(str) 

總結其內容輸出:

sum(b) 
3263 

正確的結果將是

2915 

在至少這是計算器說的。 此功能:

def somma_hex(str): 
    s = 0 
    for i in range(0,len(str)-1,2): 
     s += int(byte[i:i+2],16) 

輸出正確的值,2915

這沒什麼大不了的,我可以用簡單的函數,我寫的,而不是sum()但我想知道,發生了什麼?

謝謝

+4

您正在總結一個十六進制數字的字節數組。當然,答案是錯誤的。嘗試使用'binascii'先將十六進制解碼爲字節。 – nneonneo

+0

解碼實際上是這樣做的。 'sum(bytearray(str.decode(「hex」)))'給出正確的輸出。 – powder

+0

FWIW,'bytearray'有一個[fromhex](https://docs.python.org/3.1/library/stdtypes.html#bytearray.fromhex)方法 – kalhartt

回答

0

Bytearray有42個由sum()分析的8位元素。 在somma_hex中,將其分割爲兩個字節的塊並將它們解析爲16位整數。 事實很明顯。

+0

對不起,我貼的代碼不夠清楚,在'somma_hex()'我傳遞十六進制字符串,所以一次總結兩個字符實際上導致1個字節 – powder