Байтовые строки bytes в Python
Тип данных bytes — это неизменяемые последовательности отдельных байтов. Основные двоичные протоколы основаны на кодировании текста ASCII .
Синтаксис для байтовых литералов в основном такой же, как и для строковых литералов, за исключением того, что добавляется префикс ‘b’ :
- Одинарные кавычки: b’still allows embedded «double» quotes’
- Двойные кавычки: b»still allows embedded ‘single’ quotes»
- Тройные кавычки: b»’3 single quotes»’b»»»3 double quotes»»»
Как и в случае строковых литералов, байтовые литералы могут также использовать префикс ‘r’ для отключения обработки escape-последовательностей.
Помимо литеральных форм, объекты bytes могут быть созданы с помощью встроенного класса bytes() :
- Заполненный нулями объект байтов указанной длины: bytes(10) .
- Из итерируемых целых чисел: bytes(range(20)) .
- Копирование существующих двоичных данных через буферный протокол: bytes(obj) .
В то время как байтовые литералы основаны на тексте ASCII , байтовые объекты фактически ведут себя как неизменяемые последовательности целых чисел, причем каждое значение в последовательности ограничено таким образом, что 0
Для байтовых строк доступны следующие операции:
- общие операции c последовательностями;
- методы доступные bytes и bytearray типам.
Две шестнадцатеричные цифры точно соответствуют одному байту, поэтому шестнадцатеричные числа являются широко используемым форматом для описания двоичных данных. Соответственно, тип bytes имеет дополнительный метод класса для чтения данных в этом формате:
bytes.fromhex(string) ::
Метод bytes.fromhex() возвращает объект bytes , декодируя данный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт, при этом пробелы ASCII игнорируются.
>>> bytes.fromhex('2Ef0 F1f2 ') # b'.\xf0\xf1\xf2'
bytes.hex() ::
Метод bytes.hex() преобразовывает объект bytes в его шестнадцатеричное представление. Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта.
>>> b'\xf0\xf1\xf2'.hex() # 'f0f1f2'
В Python-3.8 метод bytes.hex() поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричный вывод.
Если нужно облегчить чтение шестнадцатеричной строки, можно указать параметр sep разделителя из одного символа для включения в вывод. По умолчанию между каждым байтом. Второй необязательный параметр bytes_per_sep управляет интервалом. Положительные значения вычисляют положение разделителя справа, отрицательные значения слева.
>>> value = b'\xf0\xf1\xf2' >>> value.hex('-') # 'f0-f1-f2' >>> value.hex('_', 2) # 'f0_f1f2' >>> b'UUDDLRLRAB'.hex(' ', -4) #'55554444 4c524c52 4142'
Важно: Поскольку байтовые объекты являются неизменяемыми последовательностями целых чисел (подобно кортежу), то для байтового объекта ‘b’ , b[0] будет целым числом, а b[0:1] — байтовым объектом длины 1. Это контрастирует с текстовыми строками, где индексация и срез будут производить строку длиной 1 символ.
Представление объектов bytes использует литеральный формат (b’. ‘) так как это часто более полезно и наглядно, чем, например, bytes([46, 46, 46]) . Вы всегда можете преобразовать объект bytes в список целых чисел с помощью list(b).
Примеры использования:
>>> b = bytes([46, 46, 46]) >>> b # b'. ' >>> list(b) # [46, 46, 46] >>> b = bytes(range(40,60,2)) >>> b # b'(*,.02468:' >>> list(b) [40, 42, 44, 46, 48, 50, 52, 54, 56, 58]
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Утиная типизация ‘Duck Typing’
- Что такое вызываемый объект callable?
- Как проверить тип переменной/объекта
- Логический тип данных bool
- Целые числа int
- Ограничение длины преобразования целочисленной строки
- Вещественные числа float
- Комплексные числа complex
- Типы последовательностей
- Список list
- Кортеж tuple
- Диапазон range
- Текстовые строки str
- Словарь dict
- Множество set и frozenset
- Итератор Iterator, протокол итератора
- Генератор generator и выражение yield
- Контекстный менеджер with
- Байтовые строки bytes
- Байтовый массив bytearray
- Тип memoryview, буфер обмена
- Файловый объект file object
- Универсальный псевдоним GenericAlias
- Объект объединения Union
Байты (bytes и bytearray)

Байтовые строки в Python — что это такое и с чем это едят? Байтовые строки очень похожи на обычные строки, но с некоторыми отличиями. Попробуем выяснить, с какими.
Что такое байты? Байт — минимальная единица хранения и обработки цифровой информации. Последовательность байт представляет собой какую-либо информацию (текст, картинку, мелодию. ).
Создаём байтовую строку:
Что делать с байтами? Хотя байтовые строки поддерживают практически все строковые методы, с ними мало что нужно делать. Обычно их надо записать в файл / прочесть из файла и преобразовать во что-либо другое (конечно, если очень хочется, то можно и распечатать). Для преобразования в строку используется метод decode:
Bytearray в python - массив байт. От типа bytes отличается только тем, что является изменяемым. Про него, в общем-то, больше рассказать нечего.
Для вставки кода на Python в комментарий заключайте его в теги
Как в Python «красиво/правильно» преобразовать «число» в байты и обратно?
Для целых можно так (число должно быть неотрицательным):
(1).to_bytes(2, byteorder='little')
(-1+2**16).to_bytes(2, byteorder='little')
Для произвольных следует использовать struct.pack
struct.pack("i", -1)
struct.pack("f", math.pi)
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Python
- +3 ещё
Как сделать так, чтобы при регистрации пользователя в телеграмм боте его ID сохранялся в файле только один раз?
- 2 подписчика
- час назад
- 36 просмотров
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.3k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков
задан 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 использовать для экономии памяти и быстроты работы векторных операций.