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 def any2dec(num_original,base_original):
15 num_original = str(num_original)
16 base_original = int(base_original)
17 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']
18 dec = 0
19 dec_temp = list(num_original)
20 dec_temp.reverse()
21 for x,i in enumerate(dec_temp):
22 dec += dic.index(i) * base_original**(x)
23 return str(dec)
24
25
26 def dec2any(dec,base_final):
27 base_final = int(base_final)
28 dec = int(dec)
29 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']
30 numero_final_temp = []
31 numero_final = ''
32 while True:
33 temp_numero_final = dec%base_final
34 numero_final_temp.append(temp_numero_final)
35 if int(dec/base_final) == 0:
36 break
37 dec = int(dec/base_final)
38 numero_final_temp.reverse()
39 for i in numero_final_temp:
40 numero_final += dic[i]
41 return numero_final
42
43 def any2any(num_original,base_original,base_final):
44 num_dec = any2dec(num_original,base_original)
45 num_final = dec2any(num_dec,base_final)
46 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()