【问题标题】:Arduino C function to convert String to HEX?Arduino C函数将字符串转换为十六进制?
【发布时间】:2016-04-07 09:33:53
【问题描述】:

我正在寻找允许我将浮点数转换为 HEX 字符串的内置 C 或 C++ 函数,到目前为止我使用过 itoa ,但它不适用于负值,因为它适用于 unsigned for base 16,所以我想知道我可以使用哪一个来代替可以处理负值。

使用 itoa 我失去了负值,如下所示,

Acceleration X: -9 | X angle: **-0.5156689167**
Acceleration Y: -69 | Y angle: **-3.9565520286**
Acceleration Z: 986 | Z angle: 80.4013519287
Value of ACC per axe (x,y,z) in HEX ->ffcdfe751f68
Data to be send x ->**ffcd**
Data to be send y ->**fe75**
Data to be send z ->1f68

我还可以使用哪些其他功能来实现相同的功能?

【问题讨论】:

  • @Marco 谢谢,我看到了这个解决方案,我不确定它是否适用于 Arduino。
  • 如果您不确定,请尝试一下。
  • 你想通过将浮点数转换为十六进制来实现什么?您不能将float 作为四个数据字节发送吗?
  • 不清楚你到底需要什么。您是否发送包含浮点数的十六进制表示的字符串?如果是这样,字符串不能包含任意数据吗?还是字符串真的只是一个字节数组,即任何数据?我之所以这么问,是因为我觉得您请求将浮点数转换为十六进制是错误的。

标签: c++ c arduino itoa


【解决方案1】:

查看您提供的结果,我会说它们是正确的。你得到了二进制补码:

ffcd = -51 in 16-Bit binary complement
fe75 = -395 in 16-Bit binary complement
1f68 = 8040 in 16-Bit binary complement

将其除以 100 即可得到(四舍五入的)浮点值。

atoi 可以处理负值。它通过将二进制表示的最有价值的位设置为 1 来指示否定状态。如果您确实期望一个,您将不会得到 - 符号。

您可以通过将(16 位)十六进制值转换为十进制并从结果中减去 65536 自行计算二进制补码。

例如

ffcd -dec-> 65485 -sub-> 65485 - 65536 = -51 -float-> -51 / 100.0 = - 0.51

【讨论】:

  • 非常感谢我不知道 itoa 正在对最有意义的位上的符号进行编码!太完美了!
  • @Peter Paul Kiefer 另一个问题突然出现在我的脑海中,如果数字不是负数,那么如果我执行您的程序,它会被错误地转换,不是吗?所以为了检查是否为负,我应该总是检查数字中最重要的位,对吧?
  • @ndarkness ,我通过使用 strtol 从 HEX 转换为 dec 解决了我的问题
  • @ndarknes 抱歉,我来晚了。是的你是对的。正数可以通过最高有效位中的零来标识,或者如果第一个十六进制数字小于 8。我提供的示例仅适用于负数。对于正数,您不能从十进制结果中减去 65536。使用库函数 (strtol) 转换为小数是个好主意。
猜你喜欢
  • 2016-08-09
  • 1970-01-01
  • 2018-01-31
  • 2017-08-12
  • 2014-06-27
  • 2014-06-09
  • 2018-06-06
  • 1970-01-01
  • 2011-05-15
相关资源
最近更新 更多