2008-12-22 40 views
6

我正在試圖與使用python的設備進行通信。我收到了包含存儲信息的字節元組。如何可以將數據轉換成正確的值:如何將Python元組(字節數組)的一部分轉換爲整數

響應=(0,0,117,143,6)

前4個值是一個32位int告訴我多少字節已被用於最後一個值是使用的百分比。

我可以訪問元組作爲響應[0],但無法看到我如何獲得前4個值到我需要的int中。

回答

11

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

我建議包格式爲「> I」即大端; 0x0000758f(3009510)對於字節的隨機計數似乎更有可能比0x8f750000(240680960010) – tzot 2008-12-22 18:34:50

13

會,

NUM =(反應[0] < < 24)+ (反應[1] < < 16)+(反應[2] < < 8)+響應[3]

符合您的需求?

援助

+2

當閱讀上述答案時導入模塊,使用循環和理解這樣的微不足道的東西,我真的開始撓我的頭......這個答案實際上它是如何(也應該)在任何地方完成的,沒有什麼會在速度和簡單性方面勝過這個... – Tom 2011-07-26 09:28:30

+0

一個簡單的方法去做 – user2578666 2014-01-23 22:44:49

4

OK,你不指定endinanness或整數是否簽名或者和它(也許)與結構模塊更快,但:

b = (8, 1, 0, 0) 
sum(b[i] << (i * 8) for i in range(4)) 
+0

僅供參考,這是爲小端,可能會稍微改進作爲'sum(b [i] <<(i * 8)for i in range(len(b)))'以允許可變大小輸入或'sum(response [i] <<(i * 8)for i在範圍內(len(響應)-1))'。 – Caltor 2012-10-15 14:36:15

+0

@Ad__我喜歡這個解決方案,因爲它可能比struct.unpack更快,而且與該方法不同,它不需要導入模塊。你能提供一個能處理大字節的版本嗎? – Caltor 2012-10-16 23:44:33

4

你也可以將使用陣列模塊的

import struct 
from array import array 
response = (0, 0, 117, 143, 6) 
a = array('B', response[:4]) 
struct.unpack('>I', a) 

(30095L,) 
0

如何使用該映射函數:

a = (0, 0, 117, 143, 6) 
b = [] 
map(b.append, a) 

而且,我不知道這是不是你正在尋找:

response = (0, 0, 117, 143, 6) 
response[0:4] 
3

這看起來像減少工作!

你基本上需要的是,一次位移一個字節,然後在序列中添加(加)下一個字節。

a = (0, 0, 117, 143, 6) 
reduce(lambda x, y: (x<<8) + y, a) 
7704326 
相關問題