aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/shorturls/baseconv.py52
1 files changed, 24 insertions, 28 deletions
diff --git a/src/shorturls/baseconv.py b/src/shorturls/baseconv.py
index 0e62b83..1b4fd15 100644
--- a/src/shorturls/baseconv.py
+++ b/src/shorturls/baseconv.py
@@ -13,14 +13,25 @@ Sample usage:
"""
class BaseConverter(object):
- decimal_digits = "0123456789"
decode_mapping = {}
def __init__(self, digits):
self.digits = digits
+ self.length = len(digits)
def from_decimal(self, i):
- return self.convert(i, self.decimal_digits, self.digits)
+ if i < 0:
+ i, neg = -i, 1
+ else:
+ neg = 0
+ enc = ''
+ while i >= self.length:
+ i, mod = divmod(i, self.length)
+ enc = self.digits[mod] + enc
+ enc = self.digits[i] + enc
+ if neg:
+ enc = '-' + enc
+ return enc
def to_decimal(self, s):
if self.decode_mapping:
@@ -31,35 +42,20 @@ class BaseConverter(object):
else:
new += digit
s = new
- return int(self.convert(s, self.digits, self.decimal_digits))
-
- def convert(number, fromdigits, todigits):
- # Based on http://code.activestate.com/recipes/111286/
- if str(number)[0] == '-':
- number = str(number)[1:]
- neg = 1
+ if str(s)[0] == '-':
+ s, neg = str(s)[1:], 1
else:
neg = 0
-
- # make an integer out of the number
- x = 0
- for digit in str(number):
- x = x * len(fromdigits) + fromdigits.index(digit)
+ decoded = 0
+ multi = 1
+ while len(s) > 0:
+ decoded += multi * self.digits.index(s[-1:])
+ multi = multi * self.length
+ s = s[:-1]
+ if neg:
+ decoded = -decoded
+ return decoded
- # create the result in base 'len(todigits)'
- if x == 0:
- res = todigits[0]
- else:
- res = ""
- while x > 0:
- digit = x % len(todigits)
- res = todigits[digit] + res
- x = int(x / len(todigits))
- if neg:
- res = '-' + res
- return res
- convert = staticmethod(convert)
-
bin = BaseConverter('01')
hexconv = BaseConverter('0123456789ABCDEF')
base62 = BaseConverter(