Есть ли способ лучше, чем int( byte_buffer.encode('hex'), 16 )

В Python я постоянно использую следующую последовательность для получения целочисленного значения из байтового буфера (в python это str).

Я получаю буфер из подпрограммы struct.unpack(). Когда я распаковываю «символ», используя

byte_buffer, = struct.unpack('c', raw_buffer)
int_value = int( byte_buffer.encode('hex'), 16 )

Есть ли способ лучше?


person Noah Campbell    schedule 28.05.2009    source источник
comment
Можете ли вы рассказать нам, почему вам нужен байтовый буфер как целое число Python?   -  person Unknown    schedule 28.05.2009
comment
Обычно я извлекаю значение из потока двоичных пакетов.   -  person Noah Campbell    schedule 28.05.2009
comment
Так является ли целочисленное значение ограниченным или неограниченным?   -  person Unknown    schedule 28.05.2009


Ответы (3)


Ограничено 1 байтом — Ноа Кэмпбелл 18 минут назад

Тогда лучший способ сделать это — создать экземпляр распаковщика структуры.

from struct import Struct

unpacker = Struct("b")
unpacker.unpack("z")[0]

Обратите внимание, что вы можете изменить «b» на «B», если вам нужен беззнаковый байт. Кроме того, формат endian не нужен.

Для всех, кто хочет узнать метод для неограниченных целых чисел, создайте вопрос и сообщите мне в комментариях.

person Unknown    schedule 28.05.2009
comment
Ааа... использование b против B возвращает целое число. (Перелистывает документацию по Python и понимает, что ему нужно продолжать читать...) - person Noah Campbell; 28.05.2009

Модуль struct отлично подходит для распаковки двоичных данных.

int_value = struct.unpack('>I', byte_buffer)[0]
person Ned Batchelder    schedule 28.05.2009
comment
Ной не указал, что число всегда будет от 0 до целого числа без знака. - person Unknown; 28.05.2009
comment
@nosklo, нет, код, который он вставил, принимает неограниченные целые числа. Попробуйте int( (a*500).encode('hex'), 16 ) для доказательства. - person Unknown; 28.05.2009

Если мы говорим о получении целочисленного значения байта, то вам нужно следующее:

ord(byte_buffer)

Не могу понять, почему это еще не предложено.

person tzot    schedule 28.05.2009
comment
Возможно, потому что struct с большей вероятностью будет правильным ответом для других частей его проблемы, если читать различные фрагменты данных из потока байтов. - person Kylotan; 29.05.2009
comment
Я собирался предложить это, но спрашивающий не уточнил, будет ли это подписанным или неподписанным, поэтому struct - лучший вариант. - person Unknown; 30.05.2009