Python Programming

Conversión de Bytes a Enteros en Python 2.7 y 3

Spread the love

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

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *