2014-02-22 45 views
1

我通過串行通信接收字節數組並將字節數組的一部分轉換爲整數。代碼如下:如何在Python中更優雅地將字節數組轉換爲整數

data = conn.recv(40) 
print(data) 

command = data[0:7] 

if(command == b'FORWARD' and data[7] == 3): 
    value = 0 
    counter = 8 
    while (data[counter] != 4): 
     value = value * 10 + int(data[counter] - 48) 
     counter = counter + 1  

總之,我解壓的bytearray data起始地址爲8和下去,直到我打的b'\x03'的定界符。所以我打開一個1到3位數的整數,並將數值放入value

這個蠻力方法的作品。但是在Python中有更好的方法嗎?我對這門語言很陌生,並且想要學習更好的方法去做這些事情。

回答

1

您可以找到分隔符,將bytearray的子​​串轉換爲str,然後將int轉換爲。這裏有一個小功能,要做到這一點:

def intToDelim(ba, delim): 
    i=ba.find(delim) 
    return int(str(ba[0:i])) 

您可以與調用

value = intToDelim(data[8:], b'\x04') 

(或B '\ X03' 如果這是你的分隔符)。這在Python 2.7中起作用,應該在Python 3中很少或根本沒有變化。

+0

感謝您的代碼。當我嘗試,我得到了以下錯誤: builtins.ValueError發生 消息:無效的文字爲int()與基地10:「b'0'」 – Daanii

+0

我想你說'return int(str(ba [0:i]))'有這個ValueError。如果是這樣,聽起來好像你的'data'(來自'conn.recv')包含四個ASCII字符'b'0'',後面跟着你的分界符。 「b'0'」對於可轉換爲整數的字符串是無效的Python語法。我不清楚你的'conn.recv'發送給你什麼語法。你從規格中知道嗎?它看起來有點像它可能試圖表達某種形式的二進制文字,在這種情況下只是零。您的原始代碼不會引發錯誤,但它會告訴您「值」是49091,我確定這不是意圖。 – mgkrebbs

相關問題