Интерпретация шестнадцатеричного числа как десятичного

У меня есть встроенная система с C-кодом, которая работает довольно просто; он читает символы через последовательное соединение, интерпретирует полученные символы как шестнадцатеричные числа и в зависимости от того, что было получено, продолжает делать что-то еще. Тем не менее, есть один особый случай, когда полученные символы десятичные, а не шестнадцатеричные. Так как этот случай очень редкий (тип случая ошибки или случая ошибки), я не хочу изменять фактический прием символов, чтобы решить, интерпретировать ли полученное значение как dec или hex, а скорее добавить быстрый алгоритм в обработка дела, где я меняю число на десятичное.

Что бы вы сказали, что это самый быстрый (как в наиболее эффективном процессоре) способ сделать это? Поскольку программное обеспечение работает на небольшом микроконтроллере, любые функции библиотеки C не являются опцией, так как я не хочу добавлять больше ненужных # include, поэтому я ищу чисто математический алгоритм.

Просто чтобы прояснить, я не прошу самый быстрый способ сделать базовое преобразование в шестнадцатеричное число, как в 0x45 -> dec 69, но я хочу преобразовать, например. 0x120 в десятичное 120.

Заранее спасибо!

РЕДАКТИРОВАТЬ: Извините, я постараюсь объяснить более подробно. Реальный код слишком длинный, и я думаю, что вставлять его здесь не нужно. Итак, вот что происходит:

Сначала я читаю полученный номер из последовательной линии, скажем, "25". Затем я превращаю его в шестнадцатеричное число, поэтому у меня есть переменная со значением read, скажем, X = 0x25. Это уже отлично работает, и я не хочу вносить изменения в это. В этом особом случае я бы хотел сейчас просто изменить интерпретацию переменной, чтобы вместо X == 0x25, X==25. Шестнадцатеричное 0x25 превращается в десятичное 25. Должна быть какая-то математическая формула для такого изменения, без необходимости каких-либо специфических для процессора инструкций или библиотечных функций?

3 ответа

Если я правильно понимаю, вы уже преобразовали поток символов ASCII в char/int переменная, предполагая, что они являются потоком шестнадцатеричных цифр. В некоторых случаях это был поток десятичных цифр (например, вы получили 45 и, обрабатывая это как hex, получил переменную со значением 69 когда - в одном особом случае - вы на самом деле хотите, чтобы его значение было 45,

Предполагая двух символов, (00-ff в общем, но для "должен был быть десятичным" мы говорим 00-99) затем:

int hexVal = GetHexStringFromSerialPort() ;
int decVal = 10*(hexVal >> 4) + (hexVal & 0x0f) ;

должен сделать свое дело. Если у вас есть более длинные строки, вам нужно расширить концепцию дальше.

Просто сделай простое while цикл, как это, предполагая, onum а также dnum целые числа без знака

dnum = 0;
while (onum) {
  digit = onum & 0xF;
  dnum = dnum*10 + digit;
  onum >>= 4;
}

это предполагает, что onum действительно в той форме, которую вы описываете (без шестнадцатеричных >9). Он просто вытесняет наименее значащую шестнадцатеричную цифру из вашего числа и добавляет ее к вашему десятичному числу.

Проверка, начинается ли ваша строка с 0x персонажи и их удаление должны сделать свое дело.

Другие вопросы по тегам