Вычисление 16-разрядного целочисленного значения из двух 8-разрядных целых чисел?

чтобы проиллюстрировать, что я имею в виду: в шестнадцатеричном редакторе у меня есть 8C 01 что это 396 прямой порядок байтов. Данные, с которыми я работаю,-это кортеж с двумя отдельными 8-битными целыми числами i = (140, 1).

чтобы вычислить 16-битное значение, мой первый подход состоял в том, чтобы просто умножить 2-е целое число на 255, а затем добавить первое. Однако этот метод просто неправильный, поскольку он не дает правильного значения (из-за моего отсутствия знаний). Может ли кто-нибудь предложить лучший (возможно, Питонический) подход?

2 ответов


вам нужно умножить его на 256 (28). Таким образом, функция будет чем-то вроде:

def pack (tup) :
    return 256*tup[1]+tup[0]

или побитовый сдвиг, который имеет больше смысла при работе с битами:

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

существует способ Python с использованием struct модуль, но не надо в таком простом случае.

>>> from struct import pack, unpack
>>> unpack('<H', pack('BB', *i))[0]
396