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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 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
bytesmust either be a bytes-like object or an iterable
producing bytes.The
byteorderargument determines the byte order used to represent the
integer. Ifbyteorderis"big", the most significant byte is at the
beginning of the byte array. Ifbyteorderis"little", the most
significant byte is at the end of the byte array. To request the
native byte order of the host system, usesys.byteorderas the byte
order value.The
signedargument 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
Method 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'@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
Method 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
Method 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.
Method 5
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
Method 6
list() can be used to convert bytes to int (works in Python 3.7):
list(b'x03x04x05')
[3, 4, 5]
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0