Hexadecimal To Decimal Converter

Como primer proyecto pensé en exponer algún que otro trabajo, pero como algunos me van a pegar si vuelvo a poner la v1 o la v2 del SNAKX, el juego en ActionScript o algún otro code que haya quedado en el olvido, prefiero presentar un sencillo trabajo en Batch.

La idea de realizar el code fue que se necesitaba un código para el S.C.O.T Team que consistiera en pasar valores decimales a Hexadecimales y como a mí me gusta ir al revés de la situación creé un code para pasar Hexadecimales a Decimales :P

Con el tiempo se van a ir dando cuenta que mi especialidad no es el diseño (es más, lo detesto y soy totalmente negado a ello...) así que mis programas consisten en una interfaz muy sencilla (o ninguna interfaz, como es el caso) y un código estructurado.



En este artículo voy a explicar el procedimiento que se sigue para pasar de un valor Hexadecimal a un valor Decimal.

Primeramente hace falta saber que un número Hexadecimal está en y un número Decimal en Base 10.

Entonces, primeramente necesitamos la longitud del texto, para ello llamamos a la función :Len, que nos retornará la longitud en la variable %long%.
A continuación separaremos cada digito para poder trabajar con él y lo guardaremos en una simulación de array que llamaremos digit_X (siendo X el valor numérico de la posición del array).
Aprovecharemos el mismo bucle para hacer la substitución de caracteres, siendo A=10 y F=16

Una vez finalizada la etapa de separación y substitución, nos introducimos en otro bucle (la razón de que no se haga todo en el mismo bucle es porque necesitamos todas las variables definidas para trabajar con ellas) en el cual aremos los cálculos apropiados.

La regla para convertir un valor hexadecimal a decimal dice que hemos de tomar los números de derecha a izquierda, multiplicarlos por su base elevada a n+1 y sumarlos.

Ejemplo con el valor '2A'

2(16^1)+A(16^0) = 2*16 + 10*1 = 32+10 = 42


Entonces hacemos exactamente eso en el último for, la única curiosidad es la función :Potencia que se encarga de multiplicar el número a su potencia

Syntaxis: call :potencia indice exponente


Finalmente mostramos el valor en hexadecimal y su conversión a decimal


A continuación os dejo el code para vuestra valoración:

@echo off
@title Hexadecimal To Decimal
SETLOCAL ENABLEDELAYEDEXPANSION
:ini
cls
set decimal=0
set /p "hexa=numero hexadecimal>>"
if not defined hexa goto ini
call :len %hexa%
set /a long+=1

for /l %%a in (1,1,%long%) do (
set digit_%%a=!hexa:~-%%a,1!
set cnt=9

for %%b in (A,B,C,D,E,F) do (
set /a cnt+=1
call set digit_%%a=!digit_%%a:%%b=%%cnt%%!)
)


for /l %%a in (1,1,%long%) do (
set /a exponente=%%a-1
call :potencia 16 !exponente!
set /a digit_%%a=!digit_%%a!*!potencia!
set /a decimal=!digit_%%a!+!decimal!
)

echo Hex: !hexa! -^> Dec: !decimal!
pause>nul
goto ini


:potencia
if %2==1 (set potencia=%1 & goto :eof)
if %2==0 (set potencia=1 & goto :eof)

set "potencia=%1"
for /l %%a in (2,1,%2) do (set /a potencia*=%1)
goto :eof



:len
set len=%1
set long=0
:_loop
call set var=%%len:~%long%,1%%
if not defined var (set /a long-=1 && goto :eof)
set /a long+=1
goto _loop