Como Converter Bytes para Integers em Python 2.7 e 3.x
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.
>
indica que os dados binários sãobig-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.HH
significa que há dois objetos de tiposH
na string de bytes.H
representaunsigned 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
.
>>> 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()
.
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
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook