0

I have a string, "stringify". Doing:

int("stringify",36)

returns:

81323539083358

Is there a way to convert that number back to "stringify"?

Bleeding Fingers
  • 6,993
  • 7
  • 46
  • 74
ruler
  • 613
  • 1
  • 10
  • 17

2 Answers2

2

There is not a built-in way to encode this number back to base 36, but there is a Python implementation on Wikipedia:
http://en.wikipedia.org/wiki/Base_36#Python_implementation

Here is a slightly modified version of that code (just changed the uppercase letters to lowercase):

def base36encode(number, alphabet='0123456789abcdefghijklmnopqrstuvwxyz'):
    """Converts an integer to a base36 string."""
    if not isinstance(number, (int, long)):
        raise TypeError('number must be an integer')

    base36 = ''
    sign = ''

    if number < 0:
        sign = '-'
        number = -number

    if 0 <= number < len(alphabet):
        return sign + alphabet[number]

    while number != 0:
        number, i = divmod(number, len(alphabet))
        base36 = alphabet[i] + base36

    return sign + base36

>>> base36encode(81323539083358)
'stringify'
Andrew Clark
  • 202,379
  • 35
  • 273
  • 306
1

just for fun here it is as a codec

import codecs
class SimpleB36Encoder:
    def encode(self,txt,errors=[]):
        return str(int(txt,36)),1

    def decode(self,txt,errors=[]):
        number = int(txt)
        alphabet = "0123456789abcdefghijklmnopqrstuvwxyz"
        base36 = ''
        sign = ''
        if number < 0:
            sign = '-'
            number = -number
        if 0 <= number < len(alphabet):
            return sign + alphabet[number]
        while number != 0:
            number, i = divmod(number, len(alphabet))
            base36 = alphabet[i] + base36
        return sign + base36,1


def find_b36(search=""):
    if search.lower() in ["base36","b36","36"]:
        return codecs.CodecInfo(
            name='base36',
            encode=SimpleB36Encoder().encode,
            decode=SimpleB36Encoder().decode
            )

codecs.register(find_b36)
encoded = "stringify".encode("36") #note this is a string
print "stringify encodes to %s"%encoded
decoded = encoded.decode("36")
print "%s decodes to %s"%(encoded,decoded)
Joran Beasley
  • 110,522
  • 12
  • 160
  • 179