Как преобразовать часть кортежа Python (массив байтов) в целое число

StackOverflow https://stackoverflow.com/questions/386753

  •  23-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь поговорить с устройством, используя Python.Мне передали кортеж байтов, содержащий информацию о хранилище.Как я могу преобразовать данные в правильные значения:

ответ = (0, 0, 117, 143, 6)

Первые 4 значения представляют собой 32-битное целое число, сообщающее мне, сколько байтов было использовано, а последнее значение — это процент использования.

Я могу получить доступ к кортежу как ответ[0], но не понимаю, как мне получить первые 4 значения в требуемый мне int.

Это было полезно?

Решение

Видеть Преобразование байтов в числа с плавающей запятой в Python

Вероятно, вы захотите использовать модуль struct, например.

import struct

response = (0, 0, 117, 143, 6)
struct.unpack(">I", ''.join([chr(x) for x in response[:-1]]))

Предполагая беззнаковый int.Возможно, существует лучший способ преобразования для распаковки: понимание списка с помощью соединения было лишь первым, что я придумал.

РЕДАКТИРОВАТЬ:См. также комментарий ΤΖΩΤΖΙΟΥ к этому ответу относительно порядка байтов.

РЕДАКТИРОВАТЬ № 2:Если вы не против использовать также модуль массива, вот альтернативный метод, который устраняет необходимость понимания списка.Благодаря @ДжимБ за указание на то, что unpack может работать и с массивами.

import struct
from array import array

response = (0, 0, 117, 143, 6)
bytes = array('B', response[:-1])
struct.unpack('>I', bytes)

Другие советы

Бы,

num = (response[0] << 24) + (response[1] << 16) + (response[2] << 8) + response[3]

удовлетворить ваши потребности?

помогать

Хорошо, вы не указываете конечный номер или подписано ли целое число, или оно (возможно) быстрее, чем с модулем структуры, но:

b = (8, 1, 0, 0)
sum(b[i] << (i * 8) for i in range(4))

Вы также можете использовать модуль массива

import struct
from array import array
response = (0, 0, 117, 143, 6)
a = array('B', response[:4])
struct.unpack('>I', a)

(30095L,)

Это похоже на работу по сокращению!

По сути, вам нужно сдвигать побитно каждый байт, а затем добавлять (добавлять) следующий байт в последовательности.

a = (0, 0, 117, 143, 6)
reduce(lambda x, y: (x<<8) + y, a)
7704326

Как насчет использования функции карты:

a = (0, 0, 117, 143, 6)
b = []
map(b.append, a)

Кроме того, я не знаю, ищете ли вы это:

response = (0, 0, 117, 143, 6)
response[0:4]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top