1

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

你会说什么是最快的(如在最有效的处理器方面)这样做的方式?由于该软件在小型 MCU 上运行,因此任何 C 库函数都不是一个选项,因为我不希望添加更多不必要的#include,因此我正在寻找纯数学算法。

为了清楚起见,我不是在问最快的方法来进行基本的十六进制到十进制转换,如 0x45 -> dec 69,但我想做的是转换例如。0x120 转化为十进制 120。

提前致谢!

编辑:对不起,我会尝试更详细地解释。实际代码太长了,我认为没有必要在这里粘贴。所以这就是发生的事情:

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

4

3 回答 3

4

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

假设两个字符,(00-ff通常,但对于“本来是十进制的”,我们正在谈论00- 99)然后:

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

应该做的伎俩。如果你有更长的字符串,你需要进一步扩展这个概念。

于 2014-04-15T11:28:15.230 回答
1

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

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

这假设这onum确实是您描述的形式(不是 hexdigits >9)。它只是从您的数字中提取最不重要的十六进制数字并将其添加到您的小数中。

于 2014-04-15T11:27:57.573 回答
0

检查您的字符串是否以0x字符开头并删除它们应该可以解决问题。

于 2014-04-15T11:10:07.770 回答