El manejo de bytes en Python difiere significativamente entre Python 2.7 y Python 3. Este artículo aclara cómo convertir bytes a enteros en ambas versiones, enfatizando las distinciones cruciales.
Tabla de Contenidos
- Python 2.7 y Cadenas de Bytes
- Convirtiendo Bytes a Enteros en Python 2.7
- Python 3 y el tipo
bytes
- Convirtiendo Bytes a Enteros en Python 3
Python 2.7 y Cadenas de Bytes
En Python 2.7, el tipo str
maneja tanto datos de texto como de bytes. Falta un tipo bytes
dedicado, como el que se encuentra en Python 3. Las cadenas de bytes son esencialmente secuencias de caracteres que representan valores de bytes. Es importante recordar que Python 2.7 está oficialmente desaprobado y no debe usarse para nuevos proyectos.
Convirtiendo Bytes a Enteros en Python 2.7
La conversión de bytes individuales a enteros se realiza con la función ord()
:
byte_string = 'A' # Representa el valor de byte de 'A'
integer_value = ord(byte_string)
print(integer_value) # Salida: 65
ord()
proporciona el punto de código Unicode, que coincide con el valor numérico del byte para bytes individuales. Para cadenas de bytes más largas, es necesaria la manipulación de bits para convertirlas en enteros más grandes. El siguiente ejemplo asume el orden de bytes little-endian:
byte_string = 'x01x02x03' # Ejemplo de cadena de bytes (little-endian)
integer_value = 0
for byte in byte_string:
integer_value = (integer_value << 8) | ord(byte)
print(integer_value) # Salida: 66051
Esto desplaza iterativamente el entero hacia la izquierda en 8 bits y aplica un OR bit a bit para incorporar cada byte. Para el orden big-endian, invierta la iteración.
Python 3 y el tipo bytes
Python 3 introduce explícitamente el tipo bytes
, separándolo del tipo str
(texto Unicode). Los objetos bytes
son secuencias inmutables de enteros que van de 0 a 255.
Convirtiendo Bytes a Enteros en Python 3
Python 3 ofrece un enfoque más limpio. Para un solo byte:
byte_data = b'x41' # Note el prefijo 'b' que indica un literal de bytes
integer_value = byte_data[0]
print(integer_value) # Salida: 65
Acceder directamente al byte en el índice 0 produce el valor entero. Para múltiples bytes, se utiliza int.from_bytes()
, especificando el orden de bytes (endianness):
byte_data = b'x01x02x03' # Ejemplo little-endian
integer_value = int.from_bytes(byte_data, byteorder='little')
print(integer_value) # Salida: 66051
byte_data = b'x01x02x03' # Ejemplo big-endian
integer_value = int.from_bytes(byte_data, byteorder='big')
print(integer_value) # Salida: 16909060
byteorder='little'
significa que el byte menos significativo es el primero, mientras que byteorder='big'
indica que el byte más significativo es el primero. Siempre especifique byteorder
para la portabilidad; de lo contrario, se utiliza el valor predeterminado del sistema.