Возможно, вам не нужна настоящая кодировка base64 для этого - она добавит отступы и т. Д., Потенциально даже приведет к появлению строк большего размера, чем hex для небольших чисел. Если нет необходимости взаимодействовать с чем-либо еще, просто используйте свою собственную кодировку. Например. вот функция, которая будет кодировать на любую базу (обратите внимание, что цифры на самом деле сначала сохраняются наименее значимыми, чтобы избежать дополнительных вызовов reverse ():
def make_encoder(baseString):
size = len(baseString)
d = dict((ch, i) for (i, ch) in enumerate(baseString)) # Map from char -> value
if len(d) != size:
raise Exception("Duplicate characters in encoding string")
def encode(x):
if x==0: return baseString[0] # Only needed if don't want '' for 0
l=[]
while x>0:
l.append(baseString[x % size])
x //= size
return ''.join(l)
def decode(s):
return sum(d[ch] * size**i for (i,ch) in enumerate(s))
return encode, decode
# Base 64 version:
encode,decode = make_encoder("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
assert decode(encode(435346456456)) == 435346456456
Это имеет то преимущество, что вы можете использовать любую базу, какую захотите, просто добавив соответствующую
символы в базовой строке кодировщика.
Обратите внимание, что выгоды для больших баз не будут такими большими. Base 64 только уменьшит размер до 2 / 3rds базы 16 (6 бит / символ вместо 4). Каждое удвоение добавляет только один бит на символ. Если у вас нет реальной необходимости уплотнять вещи, использование шестнадцатеричного кода, вероятно, будет самым простым и быстрым вариантом.