Это немного странно, но вы можете перейти к представлению шестнадцатеричной строки и там к двоичному с шестнадцатеричным кодеком:
>>> a = 2**60
>>> a
1152921504606846976L
>>> hex(a)
'0x1000000000000000L'
>>> hex(a).rstrip("L")[2:].decode('hex')
'\x10\x00\x00\x00\x00\x00\x00\x00' # 8bytes, as expected.
>>> int(_.encode('hex'), 16)
1152921504606846976L
Это немного ломается, потому что шестнадцатеричный кодек требует четного числа цифр, поэтому вам нужно будет дополнить его и установить флаг для обработки отрицательных чисел. Вот типичная упаковка / распаковка:
def pack(num):
if num <0:
num = (abs(num) << 1) | 1 # Hack - encode sign as lowest bit.
else:
num = num << 1
hexval = hex(num).rstrip("L")[2:]
if len(hexval)%2 ==1: hexval = '0' + hexval
return hexval.decode('hex')
def unpack(s):
val = int(s.encode('hex'), 16)
sign = -1 if (val & 1) else 1
return sign * (val>>1)
for i in [10,4534,23467, 93485093485, 2**50, 2**60-1, -1, -20, -2**60]:
assert unpack(pack(i)) == i
Несмотря на то, что требуется все необходимое для прокладки и т. Д., Я не уверен, что это намного лучше, чем ручное решение.