Зараз я працюю над програмою шифрування / дешифрування, і мені потрібно мати можливість перетворити байти в ціле число. Я це знаю:
bytes([3]) = b'\x03'
Але я не можу дізнатись, як зробити зворотне. Що я роблю страшенно неправильно?
Зараз я працюю над програмою шифрування / дешифрування, і мені потрібно мати можливість перетворити байти в ціле число. Я це знаю:
bytes([3]) = b'\x03'
Але я не можу дізнатись, як зробити зворотне. Що я роблю страшенно неправильно?
Відповіді:
Якщо припустити, що ви використовуєте принаймні 3,2, для цього є вбудоване :
int.from_bytes ( bytes, byteorder, *, signed = False )
...
Байтами аргументу повинен бути або байтоподібний об'єкт, або ітерабельний байт-виробник.
Аргумент byteorder визначає порядок байтів, що використовується для представлення цілого числа. Якщо порядок байтів "великий", найбільш значущий байт знаходиться на початку байтового масиву. Якщо порядок байтів "мало", найзначніший байт знаходиться в кінці масиву байтів. Щоб подати запит на власний порядок байтів хост-системи, використовуйте sys.byteorder як значення порядку байтів.
Аргумент із підписом вказує, чи використовується доповнення двох для представлення цілого числа.
## 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
і ord(b'\x03')
для окремих байт / символів?
int.from_bytes
що байт може інтерпретувати як підписане ціле число, якщо ви скажете це - int.from_bytes(b'\xe4', "big", signed=True)
повертає -28, тоді як ord()
або int.from_bytes
в беззнаковому режимі повертає 228.
Списки байтів можна підписати (принаймні в Python 3.6). Таким чином ви можете отримати десяткове значення кожного байта окремо.
>>> 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 )
не працює зі мною Я використовував функцію з цього веб-сайту, вона працює добре
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
модуль, якщо ви хочете перетворити кілька змінних одночасно.