Как конвертировать байты в интегралы на Python 2.7 и 3.x

  1. Python 2.7 Тип данных байт
  2. Python 3 байт Тип данных

Тип данных Bytes имеет значение от 0 до 255 (0x00 до 0xFF). Один байт имеет 8 бит, поэтому его максимальное значение равно 0xFF. В некоторых случаях для дальнейшей обработки данных необходимо преобразовывать байты или массив байт в целые числа. Эта короткая статья знакомит с методами преобразования байт в целые числа, методом struct.unpack на Python 2.7 и int.from_bytes() на Python 3.x.

Python 2.7 Тип данных байт

В версии Python 2.7 отсутствует встроенный тип данных bytes. Ключевое слово bytes идентично str.

>>> bytes is str
True

bytearray используется для определения объекта bytes или byte array.

>>> byteExample1 = bytearray([1])
>>> byteExample1
bytearray(b'\x01')
>>> byteExample2 = bytearray([1,2,3])
>>> byteExample2
bytearray(b'\x01\x02\x03')

Преобразование байт в интегралы на Python 2.7

Внутренний модуль Python struct может преобразовывать двоичные данные (байты) в целые числа. Он может преобразовывать байты или фактические строки на Python 2.7 и целые числа двунаправленным способом.

struct.unpack(fmt, string)
	Convert the string according to the given format `fmt` to integers. The result is a tuple even if there is only one item inside.

Примеры struct

import struct
testBytes = b'\x00\x01\x00\x02'
testResult = struct.unpack('>HH', testBytes)
print testResult
(1, 2)

Строка формата >HH содержит две части. 1. > указывает на то, что бинарные данные являются Порядок байтов, или, другими словами, данные упорядочены с большого конца (наиболее значимый бит). Например, \x00\0x1 означает \x00 высокий байт, а \x01 - низкий байт. 2. HH означает, что в строке байт есть два объекта типа H. H представляет собой незначащее короткое целое число, которое занимает 2 байта.

Вы можете получить разные результаты из одной и той же строки, если формат присваиваемых данных отличается.

>>> testResult = struct.unpack('<HH', testBytes)
>>> testResult
(256, 512)

Здесь < указывает на то, что endianess - это little-endian. Поэтому \x00\x01 становится 00+1*256 = 256, а не0*256+1=1`.

>>> testResult = struct.unpack('<BBBB', testBytes)
>>> testResult
(0, 1, 0, 2)

B означает, что данные неподписанные char занимают 1 байт. Следовательно, \x00\x01\x00\x02 будет преобразовано в 4 значения unsigned char, а не в 2 значения unsigned short.

Предупреждение

Длина данных, представляемых строкой формата, должна быть одинаковой с заданными данными, в противном случае она сообщает об ошибке.

>>> testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')

Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
error: unpack requires a string argument of length 3

Вы можете проверить официальный документ модуля struct, чтобы получить дополнительную информацию о строках форматирования.

Python 3 байт Тип данных

bytes - это встроенный тип данных на Python 3, поэтому вы можете определять байты напрямую, используя ключевое слово bytes.

>>> testByte = bytes(18)
>>> type(testByte)
<class 'bytes'>

Вы также можете напрямую определить массив байт или байт, как показано ниже.

>>> testBytes = b'\x01\x21\31\41'
>>> type(testBytes)
<class 'bytes'>

Преобразование байтов в интегралы на Python 3

Кроме модуля struct, который уже был представлен на Python 2.7, также можно использовать новый встроенный целочисленный метод на Python 3 для выполнения преобразования байт-в-интегры, то есть метод int.from_bytes().

int.from_bytes() Примеры

>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big')
61712

Опция byteorder аналогична struct.unpack() формату определения байт-ордера.

Информация

Представление в байтах будет преобразовано в одно целое число.

int.from_bytes() имеет третью опцию signed для присвоения целочисленного типа signed или unsigned.

>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big', signed=True)
-3824

Использовать [] When Bytes is unsigned char

Если формат данных имеет формат unsigned char, содержащий только один байт, то можно напрямую использовать индекс объекта для доступа, а также получить целое число данных.

>>> testBytes = b'\xF1\x10'
>>> testBytes[0]
241
>>> testBytes[1]
16

Сопутствующая статья - Python Bytes

  • Как преобразовать Int в байты на Pythonх 2 и 3
  • Как преобразовать байты в строку на Pythonх 2 и 3
  • Как преобразовать строку в байты на Python
  • comments powered by Disqus