Перейти к содержимому

Как перевести число в байты python

  • автор:

Байтовые строки 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 3 логотип

Байтовые строки в 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

  • 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 использовать для экономии памяти и быстроты работы векторных операций.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *