从两个 8 位整数计算 16 位整数值?
Calculating 16-bit integer value from two 8-bit integers?
为了说明我的意思:在十六进制编辑器中,我有 8C 01
这是 396
little-endian。我正在处理的数据是一个包含两个单独的 8 位整数的元组 i = (140, 1)
.
要计算 16 位值,我的第一种方法是简单地将第二个整数乘以 255,然后加上第一个整数。然而,这种方法是完全错误的,因为它没有给出正确的值(由于我缺乏知识)。谁能提供更好的(可能是 Pythonic)方法?
您需要将其乘以 256 (28)。所以这个函数应该是这样的:
def pack (tup) :
return 256*tup[1]+tup[0]
或执行 bitwise shift,这在使用位时更有意义:
def pack(tup) :
return (tup[1]<<8)|tup[0]
此处<<
表示您将tup[1]
的值放在左边八个位置。管道 (|
) 表示您执行 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('<H', pack('BB', *i))[0]
396
为了说明我的意思:在十六进制编辑器中,我有 8C 01
这是 396
little-endian。我正在处理的数据是一个包含两个单独的 8 位整数的元组 i = (140, 1)
.
要计算 16 位值,我的第一种方法是简单地将第二个整数乘以 255,然后加上第一个整数。然而,这种方法是完全错误的,因为它没有给出正确的值(由于我缺乏知识)。谁能提供更好的(可能是 Pythonic)方法?
您需要将其乘以 256 (28)。所以这个函数应该是这样的:
def pack (tup) :
return 256*tup[1]+tup[0]
或执行 bitwise shift,这在使用位时更有意义:
def pack(tup) :
return (tup[1]<<8)|tup[0]
此处<<
表示您将tup[1]
的值放在左边八个位置。管道 (|
) 表示您执行 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('<H', pack('BB', *i))[0]
396