c-将十六进制数字解释为十进制



我有一个运行C代码的嵌入式系统,它的工作非常直接;它通过串行连接读取字符,将接收到的字符解释为十六进制数字,并根据接收到的内容继续执行其他操作。然而,有一种非常特殊的情况,接收到的字符是十进制而不是十六进制。由于这种情况非常罕见(有点像错误情况中的错误情况),我不想修改实际的字符接收来决定是将接收到的值解释为dec还是hex,而是在将数字更改为十进制的情况处理中添加一个快速算法。

你认为最快(在最高效的处理器方面)的方法是什么?由于该软件运行在一个小型MCU上,任何C库函数都不是一个选项,因为我不想添加任何不必要的#include,所以我正在寻找一个纯粹的数学算法。

需要明确的是,我并不是要求用最快的方法来进行0x45->dec69中的基本十六进制到十进制的转换,但我想做的是将例如0x120转换为十进制120。

提前感谢!

编辑:对不起,我会详细解释的。实际的代码太长了,我认为没有必要把它粘贴在这里。下面是发生的事情:

首先,我从串行线路读取一个接收到的数字,比如说"25"。然后我把它变成十六进制数,所以我有一个读取值的变量,比如说X=0x25。这已经很好了,我不想对此进行修改。在这个非常特殊的情况下,我现在想做的只是改变变量的解释,使X==0x25变成X==25。十六进制0x25变为十进制25。这样的改变必须有某种数学公式,而不需要任何处理器特定的指令或库函数?

如果我理解正确,您已经将ASCII字符流转换为char/int变量,假设它们是十六进制数字流。在某些情况下,它们实际上是一个十进制数字流(例如,您收到了45,并将其视为十六进制,得到了一个值为69的变量,而在一个特殊情况下,您实际上希望其值是45

假设有两个字符,(通常为00-ff,但对于"本应为十进制",我们称之为00-99),则:

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

应该做到这一点。如果有较长的字符串,则需要进一步扩展这个概念。

只需像这样做一个简单的while循环,假设onumdnum是无符号整数

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

这假设onum实际上是您所描述的形式(没有>9的六进制数字)。它只是从你的数字中取出最不重要的六进制数字,并将其添加到你的小数中。

检查字符串是否以0x字符开头并删除它们就可以了。

最新更新