São 3 funções simples para conversão de números inteiros de qualquer base para qualquer base.
1- any2dec(num_original,base_original) - Esta função converte qualquer número da base 2 a 36 para qualquer base. Onde num_original é o número a ser convertido, e base_original é o valor de sua base (de 2 a 36 só considerando inteiros).
2- dec2any(dec,base_final) = Esta função converte qualquer número decimal para qualquer base de 2 a 36. Onde dec é o número decimal a ser convertido, e base_final é a base para qual se deseja converter o número (base_final: de 2 a 36 só considerando inteiros.)
3- any2any(num_original,base_original,base_final) = aglutina as duas funções acima para conversão direta de um número num_original de base base_original para uma determinada base_final.
OBS: tanto num_original quanto dec podem ser passados a função como string, ou inteiros, porém base deve ser sempre um inteiro.
OBS2:: Ambas as funções retornam sempre strings.
OBS3: As bases base_original e base_final são convertidas para inteiro
Abaixo temos o código desta biblioteca que chamo de base_convert.py.
Código
1 # -*- coding: cp1252 -*-
2 # Conversão des:
3 #
4 # Por Alexandre Martins Klostermann
5 # alexandre.klostermann@gmail.com
6 #
7 # any2dec: Converte o numero "any" na base "base"
8 # para decimal, retornando "dec"
9 #
10 # dec2any: Converte um numero decimal "dec" para a
11 # base "base" retornando o valor convertido
12 # em "any"
13
14 import string
15
16 def any2dec(num_original,base_original):
17 num_original = str(num_original)
18 base_original = int(base_original)
19 dic = ['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', 'W', 'X', 'Y', 'Z']
20 x = 0
21 dec = 0
22 dec_temp = list(num_original)
23 dec_temp.reverse()
24 for i in dec_temp:
25 dec = dec + ( (dic.index(i)) * (base_original**(x)))
26 x = x+1
27 return str(dec)
28
29
30 def dec2any(dec,base_final):
31 base_final = int(base_final)
32 dec = int(dec)
33 dic = ['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', 'W', 'X', 'Y', 'Z']
34 numero_final_temp = []
35 numero_final = ''
36 while True:
37 temp_numero_final = dec%base_final
38 numero_final_temp.append(temp_numero_final)
39 if ((int(dec/base_final)) == 0):
40 break
41 dec = int(dec/base_final)
42 numero_final_temp.reverse()
43 for i in numero_final_temp:
44 numero_final = numero_final + (dic[i])
45 return numero_final
46
47 def any2any(num_original,base_original,base_final):
48 num_dec = any2dec(num_original,base_original)
49 num_final = dec2any(num_dec,base_final)
50 return num_final
Aplicado em Modo Gráfico
Usando o Eagle temos o mesmo programa em modo gráfico.
OBS: necessita pyGTK, pyCairo, Eagle e outros.
1 # -*- coding: cp1252 -*-
2 #Conversor de Bases Grafico.
3 from eagle import *
4 import base_convert
5
6 def executar(app, wid):
7 num_original= app["valor_inicial"]
8 base_original= app["base_inicial"]
9 base_final= app["base_final"]
10 app["valor_final"] = base_convert.any2any(num_original,base_original,base_final)
11
12
13 def limpar(app, wid):
14 app["valor_inicial"] = ""
15 app["valor_final"] = ""
16
17 App(
18 title="Conversor de Bases",
19 window_size = (250,250),
20 center=(
21 Entry(id="valor_inicial", label="Numero Original:", editable=True, persistent=True),
22 UIntSpin(id="base_inicial", label="Base Original:", value=2, min=2, max=36, step=1),
23 UIntSpin(id="base_final", label="Base Desejada:", value=2, min=2, max=36, step=1),
24 Entry(id="valor_final", label="Valor Final: ", editable=False, persistent=True),
25 ),
26 bottom=(
27 Button(id="bCalcular", label="Calcular", callback=executar),
28 Button(id="bLimpar", label="Limpar", callback=limpar),
29 ),
30 )
31
32 run()