#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 = '
Комментариев нет:
Отправить комментарий