diff --git a/aprslib/base91.py b/aprslib/base91.py index 466c35a..6ce29f4 100644 --- a/aprslib/base91.py +++ b/aprslib/base91.py @@ -20,10 +20,16 @@ Provides facilities for covertion from/to base91 """ __all__ = ['to_decimal', 'from_decimal'] -from math import log +from math import log, ceil +import sys from re import findall from . import string_type, int_type +if sys.version_info < (3,): + _range = xrange +else: + _range = range + def to_decimal(text): """ @@ -36,6 +42,7 @@ def to_decimal(text): if findall(r"[\x00-\x20\x7c-\xff]", text): raise ValueError("invalid character in sequence") + text = text.lstrip('!') decimal = 0 length = len(text) - 1 for i, char in enumerate(text): @@ -60,12 +67,15 @@ def from_decimal(number, padding=1): elif padding < 1: raise ValueError("Expected padding to be >0") elif number > 0: - for divisor in [91**e for e in reversed(range(int(log(number) / log(91)) + 1))]: - quotient = number // divisor - number = number % divisor + max_n = ceil(log(number) / log(91)) + + for n in _range(int(max_n), -1, -1): + quotient, number = divmod(number, 91**n) text.append(chr(33 + quotient)) - # add padding if necessary - text = ['!'] * (padding-len(text)) + text + text = "".join(text).lstrip('!') - return "".join(text) + # add padding if necessary + text = '!' * (padding-len(text)) + text + + return text diff --git a/setup.py b/setup.py index 286136e..7855e49 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,9 @@ setup( 'Intended Audience :: Developers', 'License :: OSI Approved :: GNU General Public License v2 (GPLv2)', 'Programming Language :: Python', - 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Communications :: Ham Radio', ], test_suite='tests', diff --git a/tests/test_base91.py b/tests/test_base91.py index 958f4c7..6e2fc7a 100644 --- a/tests/test_base91.py +++ b/tests/test_base91.py @@ -104,7 +104,7 @@ class c_Both(unittest.TestCase): self.assertEqual(result, number) def test_stability(self): - for number in range(50): + for number in range(200): largeN = 91 ** number text = base91.from_decimal(largeN) result = base91.to_decimal(text)