¿Convertir bytes a int?


84

Actualmente estoy trabajando en un programa de cifrado / descifrado y necesito poder convertir bytes en un número entero. Yo sé eso:

bytes([3]) = b'\x03'

Sin embargo, no puedo averiguar cómo hacer lo inverso. ¿Qué estoy haciendo terriblemente mal?


2
También está el structmódulo si desea convertir múltiples variables a la vez.
tdelaney

Respuestas:


131

Suponiendo que tiene al menos 3.2, hay una función incorporada para esto :

int.from_bytes ( bytes, byteorder, *, firmado = Falso )

...

Los bytes del argumento deben ser un objeto similar a bytes o un bytes de producción iterable.

El argumento de orden de bytes determina el orden de bytes utilizado para representar el número entero. Si el orden de bytes es "grande", el byte más significativo está al principio de la matriz de bytes. Si el orden de bytes es "pequeño", el byte más significativo se encuentra al final de la matriz de bytes. Para solicitar el orden de bytes nativo del sistema host, use sys.byteorder como el valor del orden de bytes.

El argumento con signo indica si se usa el complemento a dos para representar el número entero.


## Examples:
int.from_bytes(b'\x00\x01', "big")                         # 1
int.from_bytes(b'\x00\x01', "little")                      # 256

int.from_bytes(b'\x00\x10', byteorder='little')            # 4096
int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)  #-1024

Gracias. ¿Hay alguna diferencia entre int.from_bytesy ord(b'\x03')para bytes / caracteres individuales?
Bill

La única diferencia en la que puedo pensar es que int.from_bytespuede interpretar el byte como un entero con signo si se lo indica: int.from_bytes(b'\xe4', "big", signed=True)devuelve -28, mientras que ord()o int.from_bytesen modo sin firmar devuelve 228.
Peter DeGlopper

6

Las listas de bytes son subscriptables (al menos en Python 3.6). De esta forma puede recuperar el valor decimal de cada byte individualmente.

>>> intlist = [64, 4, 26, 163, 255]
>>> bytelist = bytes(intlist)       # b'@x04\x1a\xa3\xff'

>>> for b in bytelist:
...    print(b)                     # 64  4  26  163  255

>>> [b for b in bytelist]           # [64, 4, 26, 163, 255]

>>> bytelist[2]                     # 26 

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.