Skip to content

Instantly share code, notes, and snippets.

@peplin
Forked from simonw/baseconv.py
Created December 13, 2010 20:03

Revisions

  1. Christopher Peplin revised this gist Dec 13, 2010. 1 changed file with 7 additions and 7 deletions.
    14 changes: 7 additions & 7 deletions baseconv.py
    Original file line number Diff line number Diff line change
    @@ -56,13 +56,6 @@ def to_decimal(self, s):
    decoded = -decoded
    return decoded

    bin = BaseConverter('01')
    hexconv = BaseConverter('0123456789ABCDEF')
    base32 = Base32Converter()
    base62 = BaseConverter(
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
    )

    class Base32Converter(BaseConverter):
    """
    http://www.crockford.com/wrmg/base32.html
    @@ -79,6 +72,13 @@ def __init__(self):
    def to_decimal(self, s):
    return super(Base32Converter, self).to_decimal(s.lower())

    bin = BaseConverter('01')
    hexconv = BaseConverter('0123456789ABCDEF')
    base32 = Base32Converter()
    base62 = BaseConverter(
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
    )

    if __name__ == '__main__':
    import doctest
    doctest.testmod()
  2. Christopher Peplin revised this gist Dec 13, 2010. 2 changed files with 54 additions and 33 deletions.
    Empty file added __init__.py
    Empty file.
    87 changes: 54 additions & 33 deletions baseconv.py
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,8 @@
    """
    Convert numbers from base 10 integers to base X strings and back again.
    Original: http://www.djangosnippets.org/snippets/1431/
    Sample usage:
    >>> base20 = BaseConverter('0123456789abcdefghij')
    @@ -11,53 +13,72 @@
    """

    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)

    def to_decimal(self, s):
    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 i < 0:
    i, neg = -i, 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)
    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

    # create the result in base 'len(todigits)'
    if x == 0:
    res = todigits[0]
    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
    if str(s)[0] == '-':
    s, neg = str(s)[1:], 1
    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)
    neg = 0
    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

    bin = BaseConverter('01')
    hexconv = BaseConverter('0123456789ABCDEF')
    base32 = Base32Converter()
    base62 = BaseConverter(
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
    )

    if __name__ == '__main__':
    nums = [-10 ** 10, 10 ** 10] + range(-100, 100)
    for convertor in [bin, hex, base62]:
    for i in nums:
    assert i == bin.to_decimal(bin.from_decimal(i)), '%s failed' % i
    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())

    if __name__ == '__main__':
    import doctest
    doctest.testmod()
  3. simonw revised this gist Apr 11, 2009. 1 changed file with 5 additions and 5 deletions.
    10 changes: 5 additions & 5 deletions baseconv.py
    Original file line number Diff line number Diff line change
    @@ -3,14 +3,14 @@
    Sample usage:
    >>> base20 = BaseConvertor('0123456789abcdefghij')
    >>> base20 = BaseConverter('0123456789abcdefghij')
    >>> base20.from_decimal(1234)
    '31e'
    >>> base20.from_decimal('31e')
    1234
    """

    class BaseConvertor(object):
    class BaseConverter(object):
    decimal_digits = "0123456789"

    def __init__(self, digits):
    @@ -49,9 +49,9 @@ def convert(number, fromdigits, todigits):
    return res
    convert = staticmethod(convert)

    bin = BaseConvertor('01')
    hexconv = BaseConvertor('0123456789ABCDEF')
    base62 = BaseConvertor(
    bin = BaseConverter('01')
    hexconv = BaseConverter('0123456789ABCDEF')
    base62 = BaseConverter(
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
    )

  4. simonw created this gist Apr 11, 2009.
    63 changes: 63 additions & 0 deletions baseconv.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,63 @@
    """
    Convert numbers from base 10 integers to base X strings and back again.
    Sample usage:
    >>> base20 = BaseConvertor('0123456789abcdefghij')
    >>> base20.from_decimal(1234)
    '31e'
    >>> base20.from_decimal('31e')
    1234
    """

    class BaseConvertor(object):
    decimal_digits = "0123456789"

    def __init__(self, digits):
    self.digits = digits

    def from_decimal(self, i):
    return self.convert(i, self.decimal_digits, self.digits)

    def to_decimal(self, s):
    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
    else:
    neg = 0

    # make an integer out of the number
    x = 0
    for digit in str(number):
    x = x * len(fromdigits) + fromdigits.index(digit)

    # 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 = BaseConvertor('01')
    hexconv = BaseConvertor('0123456789ABCDEF')
    base62 = BaseConvertor(
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
    )

    if __name__ == '__main__':
    nums = [-10 ** 10, 10 ** 10] + range(-100, 100)
    for convertor in [bin, hex, base62]:
    for i in nums:
    assert i == bin.to_decimal(bin.from_decimal(i)), '%s failed' % i