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?


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

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 

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.