从两个8位整数计算16位整数值?

Hel*_*Che 7 python hex integer

为了说明我的意思:在十六进制编辑器中,我有8C 01一个396小端.我正在使用的数据是一个带有两个独立的8位整数的元组i = (140, 1).

为了计算16位值,我的第一种方法是简单地将第二个整数乘以255然后加上第一个.然而,这种方法完全错误,因为它没有给出正确的值(由于我缺乏知识).任何人都可以提供更好的(可能是Pythonic)方法吗?

Wil*_*sem 8

你需要将它乘以256(2 8).所以函数将是这样的:

def pack (tup) :
    return 256*tup[1]+tup[0]
Run Code Online (Sandbox Code Playgroud)

或执行按位移位,这在使用位时更有意义:

def pack(tup) :
    return (tup[1]<<8)|tup[0]
Run Code Online (Sandbox Code Playgroud)

<<意味着您将tup[1]八个位置的值放在左侧.pipe(|)表示执行OR运算.如果你强制元组中的值小于256并且至少在理论上可以导致一些加速,这是合理的.

更通用

如果您的元组具有任意长度(例如三个,四个或更多元素),您可以定义更通用的函数:

def pack(tup) :
    sum = 0
    for i in range(len(tup)) :
        sum |= tup[i]<<(i<<3)
    return sum
Run Code Online (Sandbox Code Playgroud)

这里<<3用作乘法的快捷方式8,因此等效函数将是:

def pack(tup) :
    sum = 0
    for i in range(len(tup)) :
        sum |= tup[i]<<(8*i)
    return sum
Run Code Online (Sandbox Code Playgroud)

或写出来,它是这样的:

tup[0]|(tup[1]<<8)|(tup[2]<<16)|(...)
Run Code Online (Sandbox Code Playgroud)


eph*_*eph 6

你应该乘以256 ......

>>> i[1]*256 + i[0]
396
Run Code Online (Sandbox Code Playgroud)

有一种使用struct模块的Python方式,但在这种简单的情况下不是必需的.

>>> from struct import pack, unpack
>>> unpack('<H', pack('BB', *i))[0]
396
Run Code Online (Sandbox Code Playgroud)