Bytes in int konvertieren?

84

Ich arbeite derzeit an einem Verschlüsselungs- / Entschlüsselungsprogramm und muss in der Lage sein, Bytes in eine Ganzzahl umzuwandeln. Ich weiß das:

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

Ich kann jedoch nicht herausfinden, wie ich das Gegenteil tun soll. Was mache ich furchtbar falsch?

Vladimir Shevyakov
quelle
2
Es gibt auch das structModul, wenn Sie mehrere Variablen gleichzeitig konvertieren möchten.
tdelaney

Antworten:

131

Vorausgesetzt, Sie haben mindestens 3.2, ist dafür Folgendes integriert :

int.from_bytes ( Bytes, Byteorder, *, signiert = False )

...

Die Argumentbytes müssen entweder ein byteähnliches Objekt oder ein iterierbares produzierendes Byte sein.

Das Byteorder-Argument bestimmt die Byte-Reihenfolge, die zur Darstellung der Ganzzahl verwendet wird. Wenn die Bytereihenfolge "groß" ist, befindet sich das höchstwertige Byte am Anfang des Bytearrays. Wenn die Bytereihenfolge "klein" ist, befindet sich das höchstwertige Byte am Ende des Bytearrays. Verwenden Sie sys.byteorder als Wert für die Bytereihenfolge, um die native Bytereihenfolge des Hostsystems anzufordern.

Das vorzeichenbehaftete Argument gibt an, ob das Zweierkomplement zur Darstellung der Ganzzahl verwendet wird.


## 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
quelle
Vielen Dank. Gibt es einen Unterschied zwischen int.from_bytesund ord(b'\x03')für einzelne Bytes / Zeichen?
Bill
Der einzige Unterschied, den ich mir int.from_bytesint.from_bytes(b'\xe4', "big", signed=True)ord()int.from_bytes
vorstellen
6

Byte-Listen sind abonnierbar (zumindest in Python 3.6). Auf diese Weise können Sie den Dezimalwert jedes Bytes einzeln abrufen.

>>> 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
quelle
1
int.from_bytes( bytes, byteorder, *, signed=False )

funktioniert bei mir nicht Ich habe die Funktion dieser Website verwendet, sie funktioniert gut

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
quelle