Интерпретация шестнадцатеричного числа как десятичного
У меня есть встроенная система с 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
персонажи и их удаление должны сделать свое дело.