为了说明我的意思:在十六进制编辑器中,我有8C 01
一个396
小端.我正在使用的数据是一个带有两个独立的8位整数的元组i = (140, 1)
.
为了计算16位值,我的第一种方法是简单地将第二个整数乘以255然后加上第一个.然而,这种方法完全错误,因为它没有给出正确的值(由于我缺乏知识).任何人都可以提供更好的(可能是Pythonic)方法吗?
你需要将它乘以256(2 8).所以函数将是这样的:
def pack (tup) : return 256*tup[1]+tup[0]
或执行按位移位,这在使用位时更有意义:
def pack(tup) : return (tup[1]<<8)|tup[0]
这<<
意味着您将tup[1]
八个位置的值放在左侧.pipe(|
)表示执行OR运算.如果你强制元组中的值小于256
并且至少在理论上可以导致一些加速,这是合理的.
如果您的元组具有任意长度(例如三个,四个或更多元素),您可以定义更通用的函数:
def pack(tup) : sum = 0 for i in range(len(tup)) : sum |= tup[i]<<(i<<3) return sum
这里<<3
用作乘法的快捷方式8
,因此等效函数将是:
def pack(tup) : sum = 0 for i in range(len(tup)) : sum |= tup[i]<<(8*i) return sum
或写出来,它是这样的:
tup[0]|(tup[1]<<8)|(tup[2]<<16)|(...)
你应该乘以256 ......
>>> i[1]*256 + i[0] 396
有一种使用struct
模块的Python方式,但在这种简单的情况下不是必需的.
>>> from struct import pack, unpack >>> unpack('