Cómo convertir bytes a enteros en Python 2.7 y 3.x
El tipo de datos Bytes
tiene un valor que va de 0 a 255 (0x00 a 0xFF). Un byte tiene 8 bits, por eso su valor máximo es 0xFF. En algunas circunstancias, es necesario convertir los bytes o el array de bytes en enteros para el posterior procesamiento de los datos. Este breve artículo introduce cómo hacer la conversión de bytes a enteros.
Tipo de datos de Python 2.7 Bytes
No hay ningún tipo de datos bytes
incorporados en la versión de Python 2.7. La palabra clave byte
es 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')
Convertir bytes a enteros en Python 2.7
El módulo interno de Python struct
podría convertir datos binarios (bytes) en enteros. Podría convertir bytes o cadenas de texto en Python 2.7 y números enteros de forma bidireccional.
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.
Ejemplos de struct
import struct
testBytes = b"\x00\x01\x00\x02"
testResult = struct.unpack(">HH", testBytes)
print testResult
(1, 2)
La cadena de formato >HH
contiene dos partes.
>
indica que los datos binarios sonbig-endian
, o en otras palabras, los datos están ordenados desde el extremo grande (el bit más significativo). Por ejemplo,\x00\0x1
significa que\x00
es un byte alto y\x01
es un byte bajo.HH
significa que hay dos objetos de tipoH
en la cadena de bytes.H
representa un enterounsigned short
que toma 2 bytes.
Puedes obtener resultados diferentes de la misma cadena si el formato de datos asignado es diferente.
>>> testResult = struct.unpack('<HH', testBytes)
>>> testResult
(256, 512)
Aquí, <
indica que la endidad es little-endian
. Por lo tanto \x00\x01
se convierte en 00+1*256 = 256
, no 0*256+1 = 1
más.
>>> testResult = struct.unpack('<BBBB', testBytes)
>>> testResult
(0, 1, 0, 2)
B
significa que los datos son unsigned char
que toman 1 byte. Por lo tanto, x00 x01 x00 x02
se convertirá en 4 valores de unsigned char
, no en 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
Puede consultar el documento oficial del módulo struct
para obtener más información sobre cadenas de formato.
Tipo de datos en Python de 3 bytes
bytes
es un tipo de datos incorporado en Python 3, por lo tanto, puedes definir los bytes directamente usando la palabra clave bytes
.
>>> testByte = bytes(18)
>>> type(testByte)
<class 'bytes'>
También puede definir directamente un array de bytes o de bytes como el que se muestra a continuación
>>> testBytes = b'\x01\x21\31\41'
>>> type(testBytes)
<class 'bytes'>
Convertir Bytes a Enteros en Python 3
Además del módulo struct
como ya se introdujo en Python 2.7, también puede usar el nuevo método de enteros incorporado en Python 3 para hacer las conversiones de bytes a enteros, es decir, el método int.from_bytes()
.
int.from_bytes()
Ejemplos
>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big')
61712
La opción byteorder
es similar a structure.unpack()
formatear la definición del orden de los bytes.
int.from_bytes()
tiene una tercera opción signed
para asignar el tipo de entero a ser signed
o unsigned
.
>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big', signed=True)
-3824
Use []
Cuando Bytes es unsigned char
Si el formato de los datos tiene el formato de unsigned char
que contiene sólo un byte, podría utilizar directamente el índice de objetos para acceder y también obtener el entero de los datos.
>>> 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