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

  1. Tipo de datos de Python 2.7 Bytes
  2. Tipo de datos en Python de 3 bytes

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)

Bsignifica que los datos sonunsigned charque toman 1 byte. Por lo tanto,x00 x01 x00 x02se convertirá en 4 valores deunsigned char, no en 2 valores deunsigned 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

Artículo relacionado - Python Bytes

  • Cómo convertir Int a Bytes en Python 2 y Python 3
  • Cómo convertir los bytes en cadenas en Python 2 y Python 3
  • Cómo convertir una cadena en bytes en Python
  • comments powered by Disqus