Convert bytes to int?

Question:

I’m currently working on an encryption/decryption program and I need to be able to convert bytes to an integer. I know that:

bytes([3]) = b'x03'

Yet I cannot find out how to do the inverse. What am I doing terribly wrong?

Asked By: Vladimir Shevyakov

||

Answers:

Assuming you’re on at least 3.2, there’s a built in for this:

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

The argument bytes must either be a bytes-like object or an iterable
producing bytes.

The byteorder argument determines the byte order used to represent the
integer. If byteorder is "big", the most significant byte is at the
beginning of the byte array. If byteorder is "little", the most
significant byte is at the end of the byte array. To request the
native byte order of the host system, use sys.byteorder as the byte
order value.

The signed argument indicates whether two’s complement is used to
represent the integer.

## Examples:
int.from_bytes(b'x00x01', "big")                         # 1
int.from_bytes(b'x00x01', "little")                      # 256

int.from_bytes(b'x00x10', byteorder='little')            # 4096
int.from_bytes(b'xfcx00', byteorder='big', signed=True)  #-1024
Answered By: Peter DeGlopper
int.from_bytes( bytes, byteorder, *, signed=False )

doesn’t work with me
I used function from this website, it works well

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
Answered By: noura selem

Lists of bytes are subscriptable (at least in Python 3.6). This way you can retrieve the decimal value of each byte individually.

>>> intlist = [64, 4, 26, 163, 255]
>>> bytelist = bytes(intlist)       # b'@x04x1axa3xff'

>>> for b in bytelist:
...    print(b)                     # 64  4  26  163  255

>>> [b for b in bytelist]           # [64, 4, 26, 163, 255]

>>> bytelist[2]                     # 26 
Answered By: Ronald

In case of working with buffered data I found this useful:

int.from_bytes([buf[0],buf[1],buf[2],buf[3]], "big")

Assuming that all elements in buf are 8-bit long.

Answered By: Peter Hirt

list() can be used to convert bytes to int (works in Python 3.7):

list(b'x03x04x05')
[3, 4, 5]
Answered By: Dmitriy Work

An old question that I stumbled upon while looking for an existing solution. Rolled my own and thought I’d share because it allows you to create a 32-bit integer from a list of bytes, specifying an offset.

def bytes_to_int(bList, offset):
    r = 0
    for i in range(4):
        d = 32 - ((i + 1) * 8)
        r += bList[offset + i] << d
    return r
Answered By: John Stabler