Como Converter Bytes para Integers em Python 2.7 e 3.x

  1. Python 2.7 Tipo de dados de bytes
  2. Tipo de Dados Python 3 Bytes

O tipo de dados Bytes tem o valor que varia de 0 a 255 (0x00 a 0xFF). Um byte tem 8 bits, é por isso que seu valor máximo é 0xFF. Em algumas circunstâncias, você precisa converter bytes ou array de bytes em inteiros para processamento de dados adicionais. Este pequeno artigo introduz como fazer a conversão dos bytes para inteiros.

Python 2.7 Tipo de dados de bytes

Não há nenhum tipo de dados bytes incorporado na versão Python 2.7. A palavra-chave byte é idêntica a str.

>>> bytes is str
True

bytearray is used to define a bytes or byte array object.

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

Converter Bytes para Inteiros em Python 2.7

O módulo interno Python struct poderia converter dados binários (bytes) para inteiros. Ele poderia converter bytes ou realmente strings em Python 2.7 e inteiros de uma forma bidirecional.

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.

Exemplos de struct

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

A string de formato >HH contém duas partes. 1. > indica que os dados binários são big-endian, ou em outras palavras, os dados são ordenados a partir da extremidade grande (bit mais significativo). Por exemplo, \x00\0x1 significa que \x00 é byte alto e \x01 é byte baixo. 2. HH significa que há dois objetos de tipos H na string de bytes. H representa unsigned short integer que leva 2 bytes.

Você pode obter resultados diferentes da mesma string se o formato de dados atribuído for diferente.

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

Aqui, < indica que a endianess é little-endian. Portanto \x00\x01 torna-se 00+1*256 = 256, e não 0*256+1 = 1 mais.

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

B significa que os dados são unsigned char tomando 1 byte. Assim, \x00\x01\x00\x02 será convertido para 4 valores de unsigned char, não mais 2 valores de unsigned short.

Atenção

O comprimento dos dados representados pela string de formato deve ser o mesmo com os dados fornecidos, caso contrário, ele reporta um erro.

>>> 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

Você pode verificar o documento oficial do módulo struct para obter mais informações de formatar strings.

Tipo de Dados Python 3 Bytes

O bytes é um tipo de dado incorporado no Python 3, portanto, você poderia definir bytes diretamente utilizando a palavra-chave bytes.

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

Você também poderia definir diretamente um array de bytes ou bytes, como abaixo

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

Converter Bytes para Integers em Python 3

Além do módulo struct como já foi introduzido no Python 2.7, você também poderia utilizar o novo método integral do Python 3 para fazer as conversões de bytes para inteiros, ou seja, o método int.from_bytes().

int.from_bytes() Exemplos

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

A opção byteorder é semelhante à definição de ordem de byte do formato struct.unpack().

Informações

A representação de bytes será convertida para um número inteiro

int.from_bytes() tem uma terceira opção signed para atribuir o tipo inteiro a ser signed ou unsigned.

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

Use [] Quando bytes for unsigned char

Se o formato dos dados tem o formato de unsigned char que contém apenas um byte, você poderia utilizar diretamente o índice de objetos para acessar e também obter o número inteiro dos dados.

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

Artigo relacionado - Python Bytes

  • Converter Int para Binário em Python