Convert bytes to int?
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. Ifbyteorder
is"big"
, the most significant byte is at the beginning of the byte array. Ifbyteorder
is"little"
, the most significant byte is at the end of the byte array. To request the native byte order of the host system, usesys.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.
Vladimir Shevyakov
Updated on November 11, 2021Comments
-
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 about 5 yearsThanks. Is there a difference between
int.from_bytes
andord(b'\x03')
for single bytes/chars? -
Peter DeGlopper about 5 yearsThe 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, whileord()
orint.from_bytes
in unsigned mode returns 228. -
A Kareem over 3 yearsThis should be equivalent to doing
int.from_bytes(bytes, 'big')
-
Krishna Oza almost 3 yearsuse
sys.byteorder
to pass the byte order while calling. -
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.