Python, байты и числа в integer
Осваиваю постепенно пайтон, пишу программу для общения с 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’ привести их к целочисленному типу данных?
Отслеживать
52.2k 11 11 золотых знаков 108 108 серебряных знаков 311 311 бронзовых знаков
задан 24 ноя 2016 в 13:21
Алексей Симаков Алексей Симаков
141 3 3 серебряных знака 13 13 бронзовых знаков
какая версия pythonа?
24 ноя 2016 в 13:48
Spyder, Python 3.5
24 ноя 2016 в 13:52
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Чтобы конвертировать байты в целое число в Питоне 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 использовать для экономии памяти и быстроты работы векторных операций.
Конвертация между байтами и строками#
Избежать работы с байтами нельзя. Например, при работе с сетью или файловой системой, чаще всего, результат возвращается в байтах.
Соответственно, надо знать, как выполнять преобразование байтов в строку и наоборот. Для этого и нужна кодировка.
Кодировку можно представлять как ключ шифрования, который указывает:
- как «зашифровать» строку в байты (str -> bytes). Используется метод encode (похож на encrypt)
- как «расшифровать» байты в строку (bytes -> str). Используется метод decode (похож на decrypt)
Эта аналогия позволяет понять, что преобразования строка-байты и байты-строка должны использовать одинаковую кодировку.
encode, decode#
Для преобразования строки в байты используется метод encode:
In [1]: hi = 'привет' In [2]: hi.encode('utf-8') Out[2]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' In [3]: hi_bytes = hi.encode('utf-8')
Чтобы получить строку из байт, используется метод decode:
In [4]: hi_bytes Out[4]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' In [5]: hi_bytes.decode('utf-8') Out[5]: 'привет'
str.encode, bytes.decode#
Метод encode есть также в классе str (как и другие методы работы со строками):
In [6]: hi Out[6]: 'привет' In [7]: str.encode(hi, encoding='utf-8') Out[7]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
А метод decode есть у класса bytes (как и другие методы):
In [8]: hi_bytes Out[8]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' In [9]: bytes.decode(hi_bytes, encoding='utf-8') Out[9]: 'привет'
В этих методах кодировка может указываться как ключевой аргумент (примеры выше) или как позиционный:
In [10]: hi_bytes Out[10]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' In [11]: bytes.decode(hi_bytes, 'utf-8') Out[11]: 'привет'
Как работать с Юникодом и байтами#
Есть очень простое правило, придерживаясь которого, можно избежать, как минимум, части проблем. Оно называется «Юникод-сэндвич»:
- байты, которые программа считывает, надо как можно раньше преобразовать в Юникод (строку)
- внутри программы работать с Юникод
- Юникод надо преобразовать в байты как можно позже, перед передачей
Перевести числа в байты
Как байты перевести в изображение?
Как байты перевести в изображение?
Килобайты перевести в байты
всем привет! как в делфи из килобайтов перевести в байты? если возможно еще и в биты
Перевести байты в ASCII в Qlineedit
Подскажите, вывожу в qlineedit определенный байт из файла и нужно что бы он отобразился в кодировке.
Как перевести байты в текст
Подскажите как переконвертировать байты из одного файла в текст с сохранением в другом файле

Перевести байты в биты и килобайты
Дана величина А, выражающая обьем информации в байтах. Перевести А в биты и килобайты
3850 / 2138 / 566
Регистрация: 02.09.2015
Сообщений: 5,425
Сообщение от BlackLightHack 
Откуда тут взялся F ?
Регистрация: 15.10.2020
Сообщений: 133
F= нет числа
3850 / 2138 / 566
Регистрация: 02.09.2015
Сообщений: 5,425
1 2 3 4
from struct import pack result = pack("i", 1234567) print(result)
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как перевести hex в байты?
Прежде, чем начнёте строчить ответ, почитайте описание. Я имею строку 0x01 и мне надо, чтобы она.
Как перевести файл в байты и наоборот?
Как перевести файл в байты и наоборот? Файлом может быть картинка или что-то другое. Также и строку.

Как перевести байты в формат картинки?
У меня с потока заполняется буфер. Мне с него нужно собрать картинку, чтобы потом ее вставить в.
Как перевести в строку все байты сразу?
у меня есть не много, не мало 3531 штук байтов такого вида 123,213,34,342,324 , их все надо.

Перевести величину в мегабайтах в биты/байты/килобайты/гигабайты
Дана емкость винчестера V в мегабайтах. Написать программу, которая бы по введенному номеру.

Как правильно перевести ключ и вектор в байты Aes
Всем здрасте. Прошу прощения если такая тема уже была, но я толком ответа не нашел. Такой вопрос: у.
Байты (bytes и bytearray)

Байтовые строки в Python — что это такое и с чем это едят? Байтовые строки очень похожи на обычные строки, но с некоторыми отличиями. Попробуем выяснить, с какими.
Что такое байты? Байт — минимальная единица хранения и обработки цифровой информации. Последовательность байт представляет собой какую-либо информацию (текст, картинку, мелодию. ).
Создаём байтовую строку:
Что делать с байтами? Хотя байтовые строки поддерживают практически все строковые методы, с ними мало что нужно делать. Обычно их надо записать в файл / прочесть из файла и преобразовать во что-либо другое (конечно, если очень хочется, то можно и распечатать). Для преобразования в строку используется метод decode:
Bytearray в python - массив байт. От типа bytes отличается только тем, что является изменяемым. Про него, в общем-то, больше рассказать нечего.
Для вставки кода на Python в комментарий заключайте его в теги