Поскольку вы используете bytes
и bytes
литералов Я предполагаю, что вы на Python 3, в в этом случае у вас есть намного лучший общий вариант для преобразования произвольных прогонов байтов в int
. Python 3 имеет потрясающий все в одном конвертере. Для вашего примера:
>>> int.from_bytes(b'\xff\xff\xce', 'big', signed=True)
-50
Он весит до огромных размеров и работает быстрее, чем все остальное.
Если вы не используете Python 3, это немного уродливее, но все же довольно быстро:
import binascii
def int_from_bytes(b):
x = int(binascii.hexlify(b), 16)
mask = 1 << (len(b) << 3) - 1
if x & mask:
x -= mask << 1
return x
который получает те же результаты, как Python 3 встроенных, когда вы делаете:
>>> int_from_bytes(b'\xff\xff\xce')
-50
Замечание об исполнении: Предварительно скомпилированный struct.Struct
победит, раздастся, если это действительно так просто, как один байт-байт, за которым следует подписанный short
, бессмысленной длины переменной длины.В этом случае, вы бы прекомпиляцию Struct
с:
unpacker = struct.Struct('>xh').unpack
Затем вы можете использовать его так:
x, = unpacker(b'\xff\xff\xce')
волочить запятой важно (Struct.unpack
возвращает Len 1 кортеж в этом случае, и присваивание x,
распаковывает единственное значение в x
.
Можете ли вы описать, что вы хотите достичь, семантически? – MaxNoe