Cómo convertir bytes a enteros en Python 2.7 y 3.x

Jinku Hu 10 octubre 2023
  1. Tipo de datos de Python 2.7 Bytes
  2. Tipo de datos en Python de 3 bytes
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.

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

Información
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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - Python Bytes