从两个 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