Konwertować bajty na int?

92

Obecnie pracuję nad programem do szyfrowania / deszyfrowania i muszę mieć możliwość konwersji bajtów na liczbę całkowitą. Wiem to:

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

Jednak nie mogę się dowiedzieć, jak zrobić coś odwrotnego. Co ja robię strasznie źle?

Vladimir Shevyakov
źródło
2
Istnieje również structmoduł, jeśli chcesz konwertować wiele zmiennych jednocześnie.
tdelaney
inverse:b'\x03'[0]
djvg

Odpowiedzi:

147

Zakładając, że masz co najmniej 3.2, jest wbudowany do tego :

int.from_bytes ( bytes, byteorder, *, signed = False )

...

Argument bajty musi być obiektem typu bajtowego lub iterowalnym bajtem produkującym.

Argument kolejność bajtów określa kolejność bajtów używaną do reprezentowania liczby całkowitej. Jeśli kolejność bajtów jest „duża”, najbardziej znaczący bajt znajduje się na początku tablicy bajtów. Jeśli kolejność bajtów jest „mała”, najbardziej znaczący bajt znajduje się na końcu tablicy bajtów. Aby zażądać rodzimej kolejności bajtów w systemie hosta, użyj sys.byteorder jako wartości kolejności bajtów.

Argument ze znakiem wskazuje, czy do reprezentacji liczby całkowitej używane jest uzupełnienie do dwóch.


## 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
źródło
Dzięki. Czy istnieje różnica między int.from_bytesi ord(b'\x03')dla pojedynczych bajtów / znaków?
Bill
Jedyną różnicą mogę myśleć, że int.from_bytesmożna interpretować jako bajt liczba całkowita ze znakiem, jeśli powiesz ją - int.from_bytes(b'\xe4', "big", signed=True)wraca -28, podczas ord()lub int.from_bytesw niepodpisanych zwrotów trybu 228.
Peter DeGlopper
8

Listy bajtów są indeksowane (przynajmniej w Pythonie 3.6). W ten sposób możesz pobrać wartość dziesiętną każdego bajtu z osobna.

>>> 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
źródło
1
int.from_bytes( bytes, byteorder, *, signed=False )

nie działa ze mną Użyłem funkcji z tej strony, działa dobrze

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
źródło