Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert bytes to int?

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?

like image 401
Vladimir Shevyakov Avatar asked Nov 30 '15 23:11

Vladimir Shevyakov


People also ask

How do you convert bytes to integers?

A byte value can be interchanged to an int value using the int. from_bytes() function. The int. from_bytes() function takes bytes, byteorder, signed, * as parameters and returns the integer represented by the given array of bytes.

Can byte be converted into int?

Byte Array to int and long. Now, let's use the BigInteger class to convert a byte array to an int value: int value = new BigInteger(bytes). intValue();

How do you convert bytes to floats?

➦ You can use the unpack() method to convert bytes to floating point numbers. The method accepts data format and the byte to be converted. ➦ On the other hand, the pack() method helps in converting data types to bytes.

How do you convert bytes to long?

The BigInteger class has a longValue() method to convert a byte array to a long value: long value = new BigInteger(bytes). longValue();


4 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'\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
like image 58
Peter DeGlopper Avatar answered Oct 16 '22 21:10

Peter DeGlopper


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 
like image 24
Ronald Avatar answered Oct 16 '22 21:10

Ronald


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
like image 3
noura selem Avatar answered Oct 16 '22 19:10

noura selem


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

list(b'\x03\x04\x05')
[3, 4, 5]
like image 3
Dmitriy Work Avatar answered Oct 16 '22 19:10

Dmitriy Work