Ao amigo Rochinha: o Getúlio se foi no dia 24/08/54, lembro-me como se fosse hoje, eu liguei para o colégio em que fazia a primeira série do Ginásio, +- lá para às 10:00 horas e perguntei se haveria aula naquele dia e me perguntaram porque ?
Naquele tempo não havia TV e o rádio é que noticiava tudo e no Ernesto Monte de Bauru não tinha rádio algum ...
Ao Euclides: não tem porque, se tiver o algorítmo que faça em menor tempo (não estava preocupado com isso, verdade) e com maior
precisão, estamos todos interessados (ao menos eu)
Como o Eolo informou, o que me moveu a transcrever vários algorítmos foi o "querer saber como se faz";
Por isso hoje, exponho os fontes das funções que fiz em lugar das DEC2HEX e HEX2DEC, ambas da LIB PTOOL52.
A razão é que se quisermos passar o Clipper para outro ambiente (XHarbour, Harbour, etc.) essas funções não causarão problemas
pois estarão no código nativo dele;
Código: Selecionar todos
*******************************************************
* função: decimal para hexadecimal e vice versa
* utilidade: permite verificar valores em codigo objeto
* permite tambem guardar valores maiores que o campo
* de bancos de dados que não podemos mais alterar a
* estrutura
******************************************************
local tela := savescreen()
local numero := 0
local cadeia := space(8)
local ctipo := " "
setcolor("w+/b,g+/n,,,bg+/b")
clear
do while .t.
@ 8,05 clear to 18,75
@ 8,05 to 18,75 double
@ 10,14 say "CONVERSÃO DE DECIMAL PARA HEXADECIMAL E VICE VERSA"
@ 12,14 say "1 - Decimal/Hexadecimal 2 - Hexadecimal/Decimal: " get ctipo ;
pict "9" valid ctipo $ "1.2"
read
if lastkey() == 27
restscreen(,,,,tela)
return
endif
if ctipo == "1"
@ 14,9 say "Informe o número .....: " get numero pict "@E #,###,###,###"
read
if numero > 0
reth := dec2hex(numero)
@ 15,9 say "Hexadecimal convertido: "
@ 15,col()+1 say reth color "gr+/b"
endif
else
@ 14,9 say "Informe o hexadecimal.: " get cadeia pict "@!"
read
if len(cadeia) > 0
retd := hex2dec(alltrim(cadeia))
@ 15,9 say "Decimal convertido ...: "
@ 15,col()+1 say alltrim(str(retd,10)) color "gr+/b"
endif
endif
@ 24,0
@ 24,15 say "Tecle algo para outra conversão - <ESC> sai "
inkey(0)
numero := 0
cadeia := space(8)
if lastkey() == 27
restscreen(,,,,tela)
exit
endif
enddo
**************************
* decimal para hexadecimal
**************************
PROCEDURE dec2hex(num)
local matrizc := {"1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}
local caract := ""
local resto := 0
local tamanho := 0
local retorno := ""
local nx
do while .t.
inteiro := int(num/16)
resto := mod(num,16)
if resto > 0
caract += matrizc[resto]
else
caract += "0"
endif
num := inteiro
if num > 16
loop
else
resto := mod(num,16)
caract += matrizc[resto]
exit
endif
enddo
tamanho := len(caract)
if tamanho == 0
return("")
endif
for nx := tamanho to 1 step -1
retorno += substr(caract,nx,1)
next
return(retorno)
*
*************************
* Hexadecimal para numero
*************************
PROCEDURE hex2dec(strings)
local matrizv := {1,16,256,4096,65536,1048576,16777216,268435456}
local tamanho := len(alltrim(strings))
local nx
local valor := 0
local posicao := 0
if tamanho == 0
return 0
endif
for nx := 1 to tamanho
if ! (substr(strings,nx,1) $ "0123456789ABCDEF")
return 0
endif
next
for nx := tamanho to 1 step -1
posicao ++
hexa := substr(strings,nx,1)
if hexa $ "0.1.2.3.4.5.6.7.8.9"
valor += (val(hexa) * matrizv[posicao])
elseif hexa == "A"
valor += (10 * matrizv[posicao])
elseif hexa == "B"
valor += (11 * matrizv[posicao])
elseif hexa == "C"
valor += (12 * matrizv[posicao])
elseif hexa == "D"
valor += (13 * matrizv[posicao])
elseif hexa == "E"
valor += (14 * matrizv[posicao])
else
valor += (15 * matrizv[posicao])
endif
next
return (valor)