Convert bytes to int?
PythonPython 3.xIntType ConversionBytePython Problem Overview
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?
Python Solutions
Solution 1 - Python
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 - Python
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 - Python
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 - Python
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.
Solution 5 - Python
list()
can be used to convert bytes to int:
list(b'\x03\x04\x05')
[3, 4, 5]
Solution 6 - Python
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