Conversão de bases numéricas não é lá um tema muito interessante, mas vou postar algumas rotinas para isso:
;função que converte inteiro para a base selecionada:
(defun i2base (n letras / lst u ex base)
(setq lst nil
ex 0
n (fix n)
base (float (length letras)));inteiros grandes...
(while (not (equal n 0.0 0.0001))
(setq u (fix (rem (/ n (expt base ex)) base))
lst (append lst (list u))
n (- n (* u (expt base ex)))
ex (1+ ex)))
(setq
ex (apply 'strcat
(reverse (mapcar '(lambda (x)
(nth x letras))
lst))))
(if (equal "" ex)
(car letras)
ex))
;converte base para inteiro:
(defun base2i (str letras / n ex st1 u base)
(setq ex (1- (strlen str))
n 0
base (float (length letras)));inteiros grandes...
(while (/= str "")
(setq st1 (substr str 1 1)
str (vl-string-subst "" st1 str)
u (vl-position st1 letras)
n (+ n (* u (expt base ex)))
ex (1- ex)))
n)
;inteiro para base 26 (+ou- como o excel)
(defun i2b26 (n)
(i2base n
'("0" "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")))
;transforma handle em numero (base 16 -> base 10)
(defun h2r (str / n ex st1 u)
(base2i str
'("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
"A" "B" "C" "D" "E" "F")))
; transforma numero em handle (base 10 -> base 16)
(defun r2h (n / lst u ex)
(i2base n
'("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
"A" "B" "C" "D" "E" "F")))
Isto definirá as funções:
I2BASE inteiro -> base (ex.: (i2base 100 '( "A" "B" "C")) retorna: "BACAB")
BASE2I base -> inteiro (ex.: (base2i "BACAB" '("A" "B" "C")) retona: 100)
I2B26 inteiro -> base 26 (ex.: (i2b26 1000) retorna: "AJA")
H2R base 16 -> inteiro (ex:.: (h2r "ABCD") retorna: 43981)
R2H inteiro -> base 16 (ex.: (r2h 123456) retorna: "1E240")
Nenhum comentário:
Postar um comentário