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?
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?
b'\x03'[0]
Odpowiedzi:
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
int.from_bytes
i ord(b'\x03')
dla pojedynczych bajtów / znaków?
int.from_bytes
moż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_bytes
w niepodpisanych zwrotów trybu 228.
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
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
struct
moduł, jeśli chcesz konwertować wiele zmiennych jednocześnie.