3

Ok so going from Base 32 hex (aka. Triacontakaidecimal) to integer is pretty easy for example:

>>>int("v", 32)
31

How do you do it the other way around however? I was thinking of setting up a dictionary if a method doesn't exist to do so.

EDIT:

I actually got this working with the dictionary, the idea of my this method was to take a base 32 hex character and increment it if the LSB wasn't set to 1

>>> def incHex(hexChar):
...     intRep = int(hexChar, 32)
...     binRep = bin(intRep)
...     if(binRep[-1:]!='1'):
...         intRep += 1
...     convDict = {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:'A',11:'B',12:'C',
...                 13:'D',14:'E',15:'F',16:'G',17:'H',18:'I',19:'J',20:'K',21:'L',
...                 22:'M',23:'N',24:'O',25:'P',26:'Q',27:'R',28:'S',29:'T',30:'U',
...                 31:'V'}
...     return convDict[intRep]
...
>>> incHex('l')
'L'
>>> incHex('m')
'N'
>>>
PDStat
  • 5,513
  • 10
  • 51
  • 86
  • possible duplicate of [convert integer to a string in a given numeric base in python](http://stackoverflow.com/questions/2267362/convert-integer-to-a-string-in-a-given-numeric-base-in-python) – Jeremy Jul 14 '11 at 11:05
  • 1
    Read here: http://stackoverflow.com/questions/209513/convert-hex-string-to-int-in-python – Artsiom Rudzenka Jul 14 '11 at 11:06
  • Actually the first link is probably too far, and the second link is a misunderstanding, I don't want to go from hex to integer, I want to go from integer to base 32 hex. I've updated my OP as it works and is what I want. – PDStat Jul 14 '11 at 11:30
  • Hex is "hexadecimal" which is base 16. Only 16. "Base 32 hex" doesn't mean anything. Please fix the question to remove the phrase "base 32 hex", since it can't mean anything. – S.Lott Jul 14 '11 at 11:32
  • 3
    Actually it does exist http://en.wikipedia.org/wiki/Base32#base32hex, but it's called Triacontakaidecimal – PDStat Jul 14 '11 at 11:35

4 Answers4

3

A dictionary is probably a little bit of overkill for what you want to do. Why not just use a tuple:

convTable = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V')

That will make lookups faster while saving you memory as well.

If you are just looking up integers in the range 0-31 then you can just do:

getHex32Rep(val):
    return convTable[val]

Also, you probably want to do:

if(binRep[-1]!='1'):

instead of

if(binRep[-1:]!='1'):
Patrick
  • 1,138
  • 7
  • 13
  • Good points, what difference is there between binRep[-1] and binRep[-1:]? – PDStat Jul 14 '11 at 12:03
  • 1
    `binRep[-1]` returns the last element of `binRep`. `binRep[-1]` Returns a list containing only the last element of `binRep`, because the `:` operator creates a list slice, as opposed to accessing an element of the array. – Patrick Jul 14 '11 at 12:06
  • 1
    It will work similarly well with just a string instead of tuple: `convTable = '0123456789ABCDEFGHIJKLMNOPQRSTUV'` – cababunga Jul 28 '11 at 20:51
2

another way to make the convDict

>>> import string
>>> convDict = {c:int(c,32) for c in (string.digits+string.ascii_lowercase)[:32]}
>>> convDict
{'1': 1, '0': 0, '3': 3, '2': 2, '5': 5, '4': 4, '7': 7, '6': 6, '9': 9, '8': 8, 'a': 10, 'c': 12, 'b': 11, 'e': 14, 'd': 13, 'g': 16, 'f': 15, 'i': 18, 'h': 17, 'k': 20, 'j': 19, 'm': 22, 'l': 21, 'o': 24, 'n': 23, 'q': 26, 'p': 25, 's': 28, 'r': 27, 'u': 30, 't': 29, 'v': 31}
John La Rooy
  • 295,403
  • 53
  • 369
  • 502
  • Is this syntax (`{key:val for key in iterable}`) only available in a particular version of Python? I get a syntax error in Python 2.6. – Chris Calo Aug 26 '11 at 20:05
  • 1
    @Christopher, yes it's 2.7+. In 2.6 the equivalent is `dict((c,int(c,32)) for c in (string.digits+string.ascii_lowercase)[:32])` – John La Rooy Aug 27 '11 at 09:57
1

I found the numconv package, which seems to provide this?

Steven
  • 28,002
  • 5
  • 61
  • 51
0

A decade later, (January 2021)

I found the following package:

https://pypi.org/project/base32-crockford/

base32-crockford

A Python module implementing the alternate base32 encoding as described by Douglas Crockford at: http://www.crockford.com/wrmg/base32.html.

He designed the encoding to:

    Be human and machine readable
    Be compact
    Be error resistant
    Be pronounceable

It uses a symbol set of 10 digits and 22 letters, excluding I, L O and U. Decoding is not case sensitive, and 'i' and 'l' are converted to '1' and 'o' is converted to '0'. Encoding uses only upper-case characters.

Hyphens may be present in symbol strings to improve readability, and are removed when decoding.

A check symbol can be appended to a symbol string to detect errors within the string.

Ideogram
  • 1,265
  • 12
  • 21