### 2008-09-20

## Python tip: base conversions

Sometimes you may require to convert between base systems, for example from Octal to BASE10, as may be required when you use the os.mkdir or os.makedirs functions.

Here is a simple script demonstrating a possible implementation:

If you now want to make a directory with a create mode of 700 (octal) you will call

Here is a simple script demonstrating a possible implementation:

#!/usr/bin/python

BASE2 = "01"

BASE8 = "01234567"

BASE10 = "0123456789"

BASE16 = "0123456789ABCDEF"

BASE62 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"

def baseconvert(number,fromdigits,todigits):

""" converts a "number" between two bases of arbitrary digits

The input number is assumed to be a string of digits from the

fromdigits string (which is in order of smallest to largest

digit). The return value is a string of elements from todigits

(ordered in the same way). The input and output bases are

determined from the lengths of the digit strings. Negative

signs are passed through.

decimal to binary

baseconvert(555,BASE10,BASE2)

'1000101011'

binary to decimal

baseconvert('1000101011',BASE2,BASE10)

'555'

integer interpreted as binary and converted to decimal (!)

baseconvert(1000101011,BASE2,BASE10)

'555'

base10 to base4

baseconvert(99,BASE10,"0123")

'1203'

base4 to base5 (with alphabetic digits)

baseconvert(1203,"0123","abcde")

'dee'

base5, alpha digits back to base 10

baseconvert('dee',"abcde",BASE10)

'99'

decimal to a base that uses A-Z0-9a-z for its digits

baseconvert(257938572394L,BASE10,BASE62)

'E78Lxik'

..convert back

baseconvert('E78Lxik',BASE62,BASE10)

'257938572394'

binary to a base with words for digits (the function cannot convert this back)

baseconvert('1101',BASE2,('Zero','One'))

'OneOneZeroOne'

"""

ifstr(number)[0]=='-':

number = str(number)[1:]

neg=1

else:

neg=0

# make an integer out of the number

x=long(0)

fordigitinstr(number):

x = x*len(fromdigits) + fromdigits.index(digit)

# create the result in base 'len(todigits)'

res=""

whilex > 0:

digit = x % len(todigits)

res = todigits[digit] + res

x /= len(todigits)

ifneg:

res = "-"+res

returnres

If you now want to make a directory with a create mode of 700 (octal) you will call

os.makedirs( "/tmp/test/path", baseconvert( 700, BASE8 ,BASE10 ) )Until next time then... Need to get back to some coding :-)