Страницы

Поиск по вопросам

воскресенье, 16 февраля 2020 г.

Python, байты и числа в integer

#python #python_3x #типы_данных


Осваиваю постепенно пайтон, пишу программу для общения с AVR контроллером через блютуз.

Из сокета я получаю данные в виде строки байт такого вида b'\xb1\xaa\xab\xac\xad\xae\xaf'.

Так как я пишу свой протокол и работаю с разными типами данных (отправляю их с МК
не в символьном виде), разбиваю строку на части, к примеру: b'\xb1', b\xaa\xab' и b\xac\xad\xae\xaf',
то есть на однобайтовый int, двухбайтовый int и четырёхбайтовый int, с чем проблем
не возникает.

Главная задача - преобразовать эти байтовые последовательности в исходные числа.
Однобайтовый int вполне получается преобразовать так:

In [64]: line = b'\t\xaa\xab\xac\xad\xae\xaf'
In [65]: line [0]
Out[65]: 9
In [72]: a = line [0]

In [73]: a
Out[73]: 9

In [74]: a += 1

In [75]: a
Out[75]: 10


Но вот метод преобразования в число двух и более бай мне неведом. В результате поиска
больше запутался.
И так, вопрос: как имея в исходных данных байтовые строки вида b\xaa\xab' и b\xac\xad\xae\xaf'
привести их к целочисленному типу данных?
    


Ответы

Ответ 1



Чтобы конвертировать байты в целое число в Питоне 3 в независимости от числа байт: >>> int.from_bytes(b'\xb1', 'big') 177 >>> int.from_bytes(b'\xaa\xab', 'big') 43691 >>> int.from_bytes(b'\xac\xad\xae\xaf', 'big') 2897063599 >>> int.from_bytes(b'\xac\xad\xae\xaf', 'big', signed=True) -1397903697 >>> int.from_bytes(b'\xac\xad\xae\xaf', 'little', signed=True) -1347506772 >>> int.from_bytes(b'\xac\xad\xae\xaf', 'little') 2947460524 Если много однотипных данных, можно array.array, numpy.array использовать для экономии памяти и быстроты работы векторных операций. Если есть обрамляющая структура, то можно прочесть данные, используя struct.Struct, ctypes.Structure (для struct из С).

Ответ 2



Посмотрите в сторону модуля struct, он как раз для этих задач. В Вашем случае: import struct line = b'\xaa\xab\xac\xad\xae\xaf' format = '

Комментариев нет:

Отправить комментарий