题
我正在尝试使用 python 与设备对话。我收到了一个包含存储信息的字节元组。如何将数据转换为正确的值:
响应 = (0, 0, 117, 143, 6)
前 4 个值是 32 位 int,告诉我已使用了多少字节,最后一个值是已使用的百分比。
我可以将元组作为响应 [0] 访问,但无法看到如何将前 4 个值获取到我需要的 int 中。
解决方案
您可能想使用 struct 模块,例如
import struct
response = (0, 0, 117, 143, 6)
struct.unpack(">I", ''.join([chr(x) for x in response[:-1]]))
假设是一个无符号整型。可能有更好的方法来进行解包转换,带有连接的列表理解只是我想到的第一件事。
编辑:另请参阅 ΤΖΩΤΖIΟY 对此答案有关字节顺序的评论。
编辑#2:如果您也不介意使用数组模块,这里有一种替代方法,可以消除对列表理解的需要。谢谢 @吉姆·B 指出 unpack 也可以对数组进行操作。
import struct
from array import array
response = (0, 0, 117, 143, 6)
bytes = array('B', response[:-1])
struct.unpack('>I', bytes)
其他提示
会,
num = (response[0] << 24) + (response[1] << 16) + (response[2] << 8) + response[3]
满足您的需求?
助剂
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)
reduce(lambda x, y: (x<<8) + y, a)
7704326
如何使用该映射函数:
a = (0, 0, 117, 143, 6)
b = []
map(b.append, a)
另外,我不知道这是不是你正在寻找:
response = (0, 0, 117, 143, 6)
response[0:4]
不隶属于 StackOverflow