No alcanza con sumarle o restarle 48 para pasar de Hexa a Decimal o viceversa. Eso solo sirve para un solo digito. Si alguien ingresara el string "432"
Deberias comenzar a hacer divisiones sucesivas, por ejemplo por 100(luego de obviamente haber restado 48d a cada digito caracter). El resultado va a ser 4 y el resto 32.
A ese 4 lo multiplicas por 100 y lo pones en un registro. EL resto (32) lo divis por 10 ahora, y al resultado, 3, lo multiplicas por 10 y se lo sumas al registro que contenia el 400. Asi seguis hasta que dividis y multiplicas por 1.
Si vas a trabajar con numeros de 16 bits por ejemplo deberias comenzar a hacer las divisiones sucesivas arrancando por 10.000
Al terminar vas a haber hecho algo similar a la funcion Atoi de C.