Вдохновленный «схемой кодирования» ответа на этот вопрос , я реализовал свой собственный алгоритм кодирования в Python.
Вот как это выглядит:
import random
from math import pow
from string import ascii_letters, digits
# RFC 2396 unreserved URI characters
unreserved = '-_.!~*\'()'
characters = ascii_letters + digits + unreserved
size = len(characters)
seq = range(0,size)
# Seed random generator with same randomly generated number
random.seed(914576904)
random.shuffle(seq)
dictionary = dict(zip(seq, characters))
reverse_dictionary = dict((v,k) for k,v in dictionary.iteritems())
def encode(n):
d = []
n = n
while n > 0:
qr = divmod(n, size)
n = qr[0]
d.append(qr[1])
chars = ''
for i in d:
chars += dictionary[i]
return chars
def decode(str):
d = []
for c in str:
d.append(reverse_dictionary[c])
value = 0
for i in range(0, len(d)):
value += d[i] * pow(size, i)
return value
Я сталкиваюсь с проблемой кодирования и декодирования очень больших целых чисел.Например, вот как большое число в настоящее время кодируется и декодируется:
s = encode(88291326719355847026813766449910520462)
# print s -> "3_r(AUqqMvPRkf~JXaWj8"
i = decode(s)
# print i -> "8.82913267194e+37"
# print long(i) -> "88291326719355843047833376688611262464"
Лучшие 16 мест идеально совпадают, но после них число отклоняется от своего оригинала.
Я полагаюэто проблема точности очень больших целых чисел при делении в Python.Есть ли способ обойти эту проблему?Или есть еще одна проблема, о которой я не знаю?