说明我的意思:在十六进制编辑器中,我8C 01
是396
little-endian。我正在使用的数据是一个带有两个独立的8位整数i = (140, 1)
的元组。
要计算16位值,我的第一种方法是简单地将第二个整数乘以255,然后添加第一个。然而,这种方法完全错误,因为它没有给出正确的值(由于我缺乏知识)。任何人都可以提供更好的(可能是Pythonic)方法吗?
答案 0 :(得分:8)
您需要将其乘以 256 (2 8 )。所以函数将是这样的:
def pack(tup) :
return (tup[1]<<8)|tup[0]
或执行bitwise shift,这在使用位时更有意义:
<<
此处tup[1]
表示您将|
八个位置的值放在左侧。管道(256
)表示您执行OR操作。如果你强制元组中的值小于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)|(...)
或者写出来,就像:
{{1}}
答案 1 :(得分:6)
你应该乘以256 ......
>>> i[1]*256 + i[0]
396
有一种使用struct
模块的Python方式,但在这种简单的情况下不是必需的。
>>> from struct import pack, unpack
>>> unpack('<H', pack('BB', *i))[0]
396