【问题标题】:How to convert a message's value from hexadecimal to decimal?如何将消息的值从十六进制转换为十进制?
【发布时间】:2021-09-08 01:57:49
【问题描述】:

我需要编写一个函数,将我在 CAN 总线上收到的消息中的消息字节 (this.byte(2)) 从十六进制转换为十进制。 例如,我在 CAN 总线上显示以下消息“F1 02 1A 13 00 00 00 00”然后该函数应为 this.byte(2)“1A”返回值 26。

我遵循了一些在互联网上找到的示例,但我仍然没有得到正确的值。 那么我的功能有什么问题呢?

variables
{
  char hexa[2];
  long decimal, place;
  int val, len;
}

int HexToDec(char hexa[])
{   
  decimal = 0;
  i=0;
  place = 1;

  len = strlen(hexa);
  len--;

  for(i=0; hexa[i]!='\0'; i++)
  {
 
      if(hexa[i]>='0' && hexa[i]<='9')
      {
          val = hexa[i] - 48;
      }
      else if(hexa[i]>='a' && hexa[i]<='f')
      {
          val = hexa[i] - 97 + 10;
      }
        else if(hexa[i]>='A' && hexa[i]<='F')
        {
            val = hexa[i] - 65 + 10;
        }

        decimal += val * _pow(16, len);
        len--;
    }

    write("Hexadecimal number = %s\n", hexa);
    write("Decimal number = %lld", decimal);

    return 0;
}

on message *
{
  HexToDec(this.BYTE(2));  // for example 1A in hexadecimal
}

【问题讨论】:

  • 你的变量hexa的内容是什么?是十六进制字符吗?例如。 F 应该转换成15?或者它是一个 raw 值,例如 0x0F 应该转换为 15
  • @M.Spiller 内容应该是我要转换的“this.byte(x)”。我不确定 CANoe 作为变量返回了什么,但我想它可能返回 0F,这就是我写 hex[2] 的原因,显然这是错误的,这就是我在这里问的原因。当我使用 ``write(" Byte : %x ", this.byte(2));` 时,我得到例如 "0F"。
  • 你不能把它分配给 long 变量吗?喜欢decimal = this.byte(2)

标签: capl canoe


【解决方案1】:

您的要求“将十六进制转换为十进制”是错误的说法。因为十六进制和十进制都是数字。您的函数 HexToDec 将字符串作为输入,而不是数字。
如果您想将this.BYTE(2) 打印为十进制值,您只需编写

write("Hex - %X", this.BYTE(2));
write("Dec - %d", this.BYTE(2));

【讨论】:

  • 我不想把它写成十进制。我需要用这个号码做进一步的工作。
  • 然后,如果您在同一事件中使用它,您可以简单地使用this.BYTE(2) 进行进一步计算。或者如果你想保存它,你可以使用int ByteValue; ByteValue = this.BYTE(2)
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 2013-10-08
  • 2014-12-31
  • 2011-07-28
  • 1970-01-01
相关资源
最近更新 更多