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

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CAPL 内置函数 memcpy 和memcmp 处理数组的若干问题相关的知识,希望对你有一定的参考价值。


目录


📙 问题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 处理数组的若干问题的主要内容,如果未能解决你的问题,请参考以下文章

CAPL脚本中关于相对路径/绝对路径操作的几个傻傻分不清的内置函数

浅析在类模版中构建成员函数时,使用memcpy产生的副作用

CAPL 脚本对.ini 配置文件的高阶操作

CAPL 中有 Wait() 或 Sleep() 函数吗?

CANoe中使用CAPL函数接口调用Vflash文件

CAPL语言概述