使用CAPL 内置函数 memcpy 和memcmp 处理数组的若干问题

  • 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
  • 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入【相亲相爱一家人】
  • 玩转CANoe,博客目录大全,点击跳转

目录

  • 问题1:怎么将byte A[5]={0x01,0x02,0x03,0x04,0x05}赋值byte B[5]?
  • 问题2:怎么把 byte A[5]={49,50,51,52,53} 赋值给 char B[10]?
  • 问题3:和问题2 时互操作,将 char A[10]="12345"转为 byte B[10]
  • 问题4:字符串赋值操作,将 char A[10]="12345"赋值给 char B[10]
  • 问题5:怎么比较是否相等两个数组byte A[5]和byte B[5] 是否相等呢
  • 问题6:两个char [] 数组(字符串)比较可以用 strncmp函数
  • 总结


问题1:怎么将byte A[5]={0x01,0x02,0x03,0x04,0x05}赋值byte B[5]?

一般做法,就是循环赋值,如下:

On key 'b' 
{
  long i;
  byte A[5]={0x01,0x02,0x03,0x04,0x05};
  byte B[5];
   //怎么将A数组赋值给B数组? 
   for(i=0;i< elCount(A);i++)
  {
    B[i] = A[i];
  }
}

  • 内置memcpy函数做法:
  • void memcpy( byte dest[], byte source[], dword length); // form 8
On key 'h' 
{
  byte A[5]={0x01,0x02,0x03,0x04,0x05};
  byte B[5];
  memcpy(B,A,elCount(A));  
  write("**0x%x,0x%x,0x%x,0x%x,0x%x",B[0],B[1],B[2],B[3],B[4]);
}

问题2:怎么把 byte A[5]={49,50,51,52,53} 赋值给 char B[10]?

这在我们诊断读取软件版本等信息时,常常需要转换

  • 一般做法,就是循环赋值,如下:
On key 'j' 
{
  long i;
  byte A[5]={49,50,51,52,53};
  char B[10];
  
  for(i=0;i< elCount(A);i++)
  {
    B[i] = A[i];
  } 
  write("**%s",B);
}
//输出:**12345

  • 内置memcpy函数做法:
  • void memcpy( char dest[], byte source[], dword length); // form 9
On key 'k' 
{
  long i;
  byte A[5]={49,50,51,52,53};
  char B[10];
  memcpy(B,A,elCount(A));
  
  write("**%s",B);
}
//输出:**12345

问题3:和问题2 时互操作,将 char A[10]="12345"转为 byte B[10]

  • 内置memcpy函数做法:
  • void memcpy( byte dest[], char source[], dword length); // form 10
On key 'l' 
{
  char A[10]="12345";
  byte B[10];
  memcpy(B,A,strlen(A));
  
  write("**%d,%d,%d,%d,%d",B[0],B[1],B[2],B[3],B[4]);
}

问题4:字符串赋值操作,将 char A[10]="12345"赋值给 char B[10]

典型的字符串赋值问题,这就有很多中函数或者方法可用了,这里也可以用内置memcpy函数

  • void memcpy( byte dest[], char source[], dword length); // form 10
On key 'm' 
{
  char A[10]="12345";
  char B[10];
  memcpy(B,A,strlen(A)); //方法1:
  //strncpy (B,A,elcount(A)); //方法2:
  //snprintf(B, elcount(B), "%s",A);//方法3 
   write("**%s",B);
}

问题5:怎么比较是否相等两个数组byte A[5]和byte B[5] 是否相等呢

  • 一般做法,可能就是在for循环中一一对比,现在可以用memcmp 方法
  • int memcmp(byte buffer1[], byte buffer2[], dword size); // form 4
  • 返回值为 0,则两者相等
On key 'n' 
{
  long Result;
  byte A[5]={0x01,0x02,0x03,0x04,0x05};
  byte B[5]={0x01,0x02,0x03,0x04,0x06};
  Result = memcmp(A, B ,elCount(A));
  write("byte A[5] and byte B[5] equal? %d",Result);
}
// 结果:byte A[5] and byte B[5] equal? -1

问题6:两个char [] 数组(字符串)比较可以用 strncmp函数

  • long strncmp(char s1[], char s2[], long len);
  • 返回值为 0,则两者相等
On key 'v' 
{
  char s1[7] = "Vector";
  char s2[7] = "Vector";
    
  if(strncmp(s1,s2,strlen(s1)))
    write("not equal");
  else
    write("equal");
}

总结

上面根据6个问题,介绍了最常用的一些赋值/比较的用法,更深一层的用法可以参考下Help文档。

memcpy 和memcmp 函数 根据参数不同重载了很多,不管是byte 数组,还是char 字符串,还是struct 结构体,都是在内存中占用连续内存的,都可以使用memcpy相互赋值。

使用CAPL 内置函数 memcpy 和memcmp 处理数组的若干问题_第1张图片

使用CAPL 内置函数 memcpy 和memcmp 处理数组的若干问题_第2张图片

23

7

  • 要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18

你可能感兴趣的:(CANoe和CAPL,CANoe,CAPL,数组)