我正在試圖與使用python的設備進行通信。我收到了包含存儲信息的字節元組。如何可以將數據轉換成正確的值:如何將Python元組(字節數組)的一部分轉換爲整數
響應=(0,0,117,143,6)
前4個值是一個32位int告訴我多少字節已被用於最後一個值是使用的百分比。
我可以訪問元組作爲響應[0],但無法看到我如何獲得前4個值到我需要的int中。
我正在試圖與使用python的設備進行通信。我收到了包含存儲信息的字節元組。如何可以將數據轉換成正確的值:如何將Python元組(字節數組)的一部分轉換爲整數
響應=(0,0,117,143,6)
前4個值是一個32位int告訴我多少字節已被用於最後一個值是使用的百分比。
我可以訪問元組作爲響應[0],但無法看到我如何獲得前4個值到我需要的int中。
見Convert Bytes to Floating Point Numbers in Python
你可能要使用的結構模塊,例如
import struct
response = (0, 0, 117, 143, 6)
struct.unpack(">I", ''.join([chr(x) for x in response[:-1]]))
假定一個unsigned int。可能有更好的方法來完成解壓縮的轉換,加入列表的理解只是我想出的第一個東西。
編輯:另請參閱關於字節順序的此答案的評論。
編輯#2:如果你不介意使用數組模塊,這裏有一個替代方法,可以避免對列表的理解。感謝@JimB指出unpack也可以在數組上運行。
import struct
from array import array
response = (0, 0, 117, 143, 6)
bytes = array('B', response[:-1])
struct.unpack('>I', bytes)
會,
NUM =(反應[0] < < 24)+ (反應[1] < < 16)+(反應[2] < < 8)+響應[3]
符合您的需求?
援助
當閱讀上述答案時導入模塊,使用循環和理解這樣的微不足道的東西,我真的開始撓我的頭......這個答案實際上它是如何(也應該)在任何地方完成的,沒有什麼會在速度和簡單性方面勝過這個... – Tom 2011-07-26 09:28:30
一個簡單的方法去做 – user2578666 2014-01-23 22:44:49
OK,你不指定endinanness或整數是否簽名或者和它(也許)與結構模塊更快,但:
b = (8, 1, 0, 0)
sum(b[i] << (i * 8) for i in range(4))
你也可以將使用陣列模塊的
import struct
from array import array
response = (0, 0, 117, 143, 6)
a = array('B', response[:4])
struct.unpack('>I', a)
(30095L,)
如何使用該映射函數:
a = (0, 0, 117, 143, 6)
b = []
map(b.append, a)
而且,我不知道這是不是你正在尋找:
response = (0, 0, 117, 143, 6)
response[0:4]
這看起來像減少工作!
你基本上需要的是,一次位移一個字節,然後在序列中添加(加)下一個字節。
a = (0, 0, 117, 143, 6)
reduce(lambda x, y: (x<<8) + y, a)
7704326
我建議包格式爲「> I」即大端; 0x0000758f(3009510)對於字節的隨機計數似乎更有可能比0x8f750000(240680960010) – tzot 2008-12-22 18:34:50