Когда мне нужно сделать что-то подобное, я предварительно запекаю массив со значениями, которые хочу.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Тогда преобразование легко
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
Это в основном подход, принятый многими реализациями библиотеки ctype.
Вы можете легко адаптировать его для работы с шестнадцатеричными цифрами.