Convert bytes to int?

355,686

Solution 1

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'\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

Solution 2

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'@\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 

Solution 3

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

Solution 4

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.

Share:
355,686
Vladimir Shevyakov
Author by

Vladimir Shevyakov

Updated on November 11, 2021

Comments

  • Vladimir Shevyakov
    Vladimir Shevyakov over 2 years

    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?

  • Bill
    Bill about 5 years
    Thanks. Is there a difference between int.from_bytes and ord(b'\x03') for single bytes/chars?
  • Peter DeGlopper
    Peter DeGlopper about 5 years
    The only difference I can think of is that int.from_bytes can interpret the byte as a signed integer if you tell it to - int.from_bytes(b'\xe4', "big", signed=True) returns -28, while ord() or int.from_bytes in unsigned mode returns 228.
  • A Kareem
    A Kareem over 3 years
    This should be equivalent to doing int.from_bytes(bytes, 'big')
  • Krishna Oza
    Krishna Oza almost 3 years
    use sys.byteorder to pass the byte order while calling.
  • Peter DeGlopper
    Peter DeGlopper almost 3 years
    @KrishnaOza - that depends. If you're converting bytes that were encoded on a remote system, say because you're receiving them over a network connection, there's no guarantee that the remote system's native byte order matches yours. This has been a significant historical problem.