From eb1e1c2feddb282c74dc597c4f51c5ccfe5c7fe1 Mon Sep 17 00:00:00 2001 From: Ben Firshman Date: Mon, 25 Jan 2010 00:05:00 +0000 Subject: Added Crockford's base32 converter --- src/shorturls/baseconv.py | 30 +++++++++++++++++++++++++++++- src/shorturls/tests/test_baseconv.py | 17 ++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/shorturls/baseconv.py b/src/shorturls/baseconv.py index 1e22ed1..1f1fbbd 100644 --- a/src/shorturls/baseconv.py +++ b/src/shorturls/baseconv.py @@ -14,6 +14,7 @@ Sample usage: class BaseConverter(object): decimal_digits = "0123456789" + decode_mapping = {} def __init__(self, digits): self.digits = digits @@ -22,6 +23,14 @@ class BaseConverter(object): return self.convert(i, self.decimal_digits, self.digits) def to_decimal(self, s): + if self.decode_mapping: + new = '' + for digit in s: + if digit in self.decode_mapping: + new += self.decode_mapping[digit] + else: + new += digit + s = new return int(self.convert(s, self.digits, self.decimal_digits)) def convert(number, fromdigits, todigits): @@ -55,4 +64,23 @@ bin = BaseConverter('01') hexconv = BaseConverter('0123456789ABCDEF') base62 = BaseConverter( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz' -) \ No newline at end of file +) + +class Base32Converter(BaseConverter): + """ + http://www.crockford.com/wrmg/base32.html + """ + decode_mapping = { + 'o': '0', + 'i': '1', + 'l': '1', + } + + def __init__(self): + super(Base32Converter, self).__init__('0123456789abcdefghjkmnpqrstvwxyz') + + def to_decimal(self, s): + return super(Base32Converter, self).to_decimal(s.lower()) + +base32 = Base32Converter() + diff --git a/src/shorturls/tests/test_baseconv.py b/src/shorturls/tests/test_baseconv.py index 5e203b7..24f944f 100644 --- a/src/shorturls/tests/test_baseconv.py +++ b/src/shorturls/tests/test_baseconv.py @@ -16,4 +16,19 @@ class BaseConvTests(unittest.TestCase): self._test_converter(baseconv.hexconv) def test_base62(self): - self._test_converter(baseconv.base62) \ No newline at end of file + self._test_converter(baseconv.base62) + + def test_base32(self): + self._test_converter(baseconv.base32) + + def test_base32_mappings(self): + converter = baseconv.base32 + self.assertEqual( + converter.from_decimal(converter.to_decimal('Fo9')), + 'f09' + ) + self.assertEqual( + converter.from_decimal(converter.to_decimal('43FG5i2L')), + '43fg5121' + ) + -- cgit v1.2.3