Перетворити байти в int?


84

Зараз я працюю над програмою шифрування / дешифрування, і мені потрібно мати можливість перетворити байти в ціле число. Я це знаю:

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

Але я не можу дізнатись, як зробити зворотне. Що я роблю страшенно неправильно?


2
Існує також structмодуль, якщо ви хочете перетворити кілька змінних одночасно.
tdelaney

Відповіді:


131

Якщо припустити, що ви використовуєте принаймні 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.
Пітер

6

Списки байтів можна підписати (принаймні в 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 

1
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.