Преобразовать байты в int?

91

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

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

Однако я не могу понять, как сделать обратное. Что я делаю ужасно неправильно?

Владимир Шевяков
источник
2
Также есть structмодуль, если вы хотите преобразовать сразу несколько переменных.
tdelaney
обратный:b'\x03'[0]
djvg

Ответы:

146

Предполагая, что вы используете как минимум 3.2, для этого есть встроенная функция :

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

...

Байты аргумента должны быть либо байтовым объектом, либо итеративным производящим байтом.

Аргумент byteorder определяет порядок байтов, используемый для представления целого числа. Если byteorder "большой", старший байт находится в начале массива байтов. Если 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.
Питер DeGlopper
8

Списки байтов можно индексировать (по крайней мере, в 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
Нура Селем
источник