Has Python 3 to_bytes been back-ported to python 2.7?
Solution 1:
Based on the answer from @nneonneo, here is a function that emulates the to_bytes API:
def to_bytes(n, length, endianess='big'):
h = '%x' % n
s = ('0'*(len(h) % 2) + h).zfill(length*2).decode('hex')
return s if endianess == 'big' else s[::-1]
Solution 2:
To answer your original question, the to_bytes
method for int
objects was not back ported to Python 2.7 from Python 3. It was considered but ultimately rejected. See the discussion here.
Solution 3:
To pack arbitrary-length long
s in Python 2.x, you can use the following:
>>> n = 123456789012345678901234567890L
>>> h = '%x' % n
>>> s = ('0'*(len(h) % 2) + h).decode('hex')
>>> s
'\x01\x8e\xe9\x0f\xf6\xc3s\xe0\xeeN?\n\xd2'
This outputs the number in big-endian order; for little endian, reverse the string (s[::-1]
).
Solution 4:
You can probably use struct.pack
instead:
>>> import struct
>>> struct.pack('>i', 123)
'\x00\x00\x00{'
It doesn't do arbitrary lengths in the way int.to_bytes
does, but I doubt you need that.