¿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?

Vladimir Shevyakov
fuente
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
Peter DeGlopper
fuente
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 
Ronald
fuente
1
int.from_bytes( bytes, byteorder, *, signed=False )

no funciona conmigo Utilicé la función de este sitio web, funciona bien

https://coderwall.com/p/x6xtxq/convert-bytes-to-int-or-int-to-bytes-in-python

def bytes_to_int(bytes):
    result = 0
    for b in bytes:
        result = result * 256 + int(b)
    return result

def int_to_bytes(value, length):
    result = []
    for i in range(0, length):
        result.append(value >> (i * 8) & 0xff)
    result.reverse()
    return result
noura selem
fuente