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.
1. >
indica que los datos binarios son big-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.
2. HH
significa que hay dos objetos de tipo H
en la cadena de bytes. H
representa un entero unsigned 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
.
La longitud de los datos representados por la cadena de formato debe ser la misma que la de los datos dados, de lo contrario, reporta un error.
>>> 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.
La representación de los bytes se convertirá en un entero
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