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:

#!/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'

"
""

if str(number)[0]=='-':
number = str(number)[1:]

neg=1
else:
neg=0

# make an integer out of the number

x=long(0)
for digit in str(number):

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


# create the result in base 'len(todigits)'
res=""
while x > 0:
digit = x % len(todigits)

res = todigits[digit] + res
x /= len(todigits)

if neg:
res = "-"+res

return res

print "'700' octal (base8) is '" + str( baseconvert( 700, BASE8 ,BASE10 ) ) + "' in base10"



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 :-)

Comments: Post a Comment

<< Home

This page is powered by Blogger. Isn't yours?