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