在其他数组中使用来自fileGetString的十六进制值

时间:2016-04-07 15:54:31

标签: arrays capl

我有一个我认为简单的问题,但不幸的是我无法自己找到解决方案。

我在.txt文件中有一个带有十六进制数据的数组(例如0x01 0x02 [...]),并希望将此数据用于另一个函数。 目的是,除了不改变静态值并向ECU发送请求之外,还要使用数组的某些部分(在此示例中为数组100)。

当我从文件中读取带有fileGetString的数据并将其打印到控制台时,它会没问题(如0x01 0x02等等)。

当我尝试将它用于下面看到的功能时,它不会采用正确的十六进制值(例如StringLongWrite [100] = 0xFF),但在跟踪数据中只使用" 30"。

因此,对于以下示例,所发送的请求将是11 12 13 30而不是11 12 13 FF。

有没有一种简单的方法可以解决这个问题? (最初我得到了我想用格式编写的数据" 01 02 03 ... FF ..."在.txt文件中并且已将其转换为" 0x01 0x02 0x03 ... 0xFF ..."数据,以防第一个数据类型更易于使用...)

非常感谢和问候罗伯特

case  1:    /* write memory */
            if(something);

      glbHandleWrite = openFileRead ("test.txt",0);

      if (glbHandleWrite != 0 && fileGetString(StringLongWrite, elcount(StringLongWrite), glbHandleWrite) != 0)
      {
      SendReq[0] = 0x11;
      SendReq[1] = 0x12;
      SendReq[2] = 0x13;
      SendReq[3] = StringLongWrite[100];
      SendRequest(ServicePhys, 4);
      setTimer( TimeOutTimer, TimeOutLong);
      write ("data %s", StringLongWrite);
      break; 
      }

      else write("Data file cannot be opened ");

1 个答案:

答案 0 :(得分:2)

0x30是字符'0'的ASCII码。

您需要将字符串"0x30"转换为数字,例如。使用strtol()

on start
{
  message 0x123 msg;
  char StringLongWrite[32] = "0x01 0x02 0x03";
  long data[2];
  dword pos = 0;

  pos = strtol(StringLongWrite, pos, data[0]);
  pos = strtol(StringLongWrite, pos, data[1]);
  pos = strtol(StringLongWrite, pos, data[2]);

  write("0x%02x,0x%02x,0x%02x", data[0], data[1], data[2]);

  msg.dlc = 8;
  msg.byte(0) = 0x42;
  msg.byte(1) = data[0];
  msg.byte(2) = data[1];
  msg.byte(3) = data[2];

  output(msg);
}