LoadRunner截取字符串操作

LoadRunner截取字符串操作

在使用LoadRunner winsockets协议写脚本,遇到下面问题:

在接收到的查询数据库的结果中我要取红色部份用于下面的select

recv buf60 769
 "\x01\x00\x00\x01"
 "\bK"
 "\x00\x00\x02\x03"
 "def\tsystem_db\n"
 "tb_tsbinfo\n"
 "tb_tsbinfo\fTskGuidebook\fTskGuidebook\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03"
 " "
 "\x00\x00\x00\x00"
 "A"
 "\x00\x00\x03\x03"
 "def\tsystem_db\n"
 "tb_tsbinfo\n"
 "tb_tsbinfo"
 "\x07"
 "Work_ID"
 "\x07"
 "Work_ID\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03\x00\x00\x00\x00\x00"
 "G"
 "\x00\x00\x04\x03"
 "def\tsystem_db\n"
 "tb_tsbinfo\n"
 "tb_tsbinfo\n"
 "WorkNum_ID\n"
 "WorkNum_ID\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03\x00\x00\x00\x00\x00"
 "I"
 "\x00\x00\x05\x03"
 "def\tsystem_db"
 "\x10"
 "tb_tskdetailinfo"
 "\x10"
 "tb_tskdetailinfo\bBatch ID"
 "\x02"
 "ID\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03"
 "!"
 "\x00\x00\x00\x00"
 "Q"
 "\x00\x00\x06\x03"
 "def\tsystem_db"
 "\x10"
 "tb_tskdetailinfo"
 "\x10"
 "tb_tskdetailinfo\tBatchName\tBatchName\f!"
 "\x00"
 ","
 "\x01\x00\x00\xfd\x00\x00\x00\x00\x00"
 "C"
 "\x00\x00\x07\x03"
 "def\tsystem_db\n"
 "tb_tsbinfo\n"
 "tb_tsbinfo\bBlock_ID\bBlock_ID\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03\x00\x00\x00\x00\x00"
 "I"
 "\x00\x00"
 "\b"
 "\x03"
 "def\tsystem_db\ftb_blockinfo\ftb_blockinfo\tBlockName\tBlockName\f!"
 "\x00\x96\x00\x00\x00\xfd\x00\x00\x00\x00\x00"
 "G"
 "\x00\x00"
 "\t"
 "\x03"
 "def\tsystem_db\ftb_blockinfo\ftb_blockinfo\bModel_ID\bModel_ID\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03\x00\x00\x00\x00\x00\x05\x00\x00"
 "\n"
 "\xfe\x00\x00"
 "\""
 "\x00\x15\x00\x00"
 "\v"
 "\x01"
 "5"
 "\x01"
 "4"
 "\x01"
 "7"
 "\x01"
 "7"
 "\x04"
 "8227"
 "\x01"
 "6"
 "\x03"
 "DAY"
 "\x01"
 "3"
 "\x15\x00\x00"
 "\f"
 "\x01"
 "5"
 "\x01"
 "4"
 "\x01"
 "7"
 "\x01"
 "7"
 "\x04"
 "8227"
 "\x01"
 "5"
 "\x03"
 "NEW"
 "\x01"
 "3"
 "\x18\x00\x00"
 "\r"
 "\x01"
 "6"
 "\x01"
 "1"
 "\x01"
 "5"
 "\x01"
 "5"
 "\x04"
 "0502"
 "\x01"
 "4"
 "\x06"
 "鏁板瓧"
 "\x01"
 "2"
 "\x1a\x00\x00\x0e\x01"
 "9"
 "\x01"
 "1"
 "\x02"
 "11"
 "\x02"
 "11"
 "\x04"
 "1601"
 "\x01"
 "4"
 "\x06"
 "鏁板瓧"
 "\x01"
 "2"
 "\x1a\x00\x00\x0f\x01"
 "9"
 "\x01"
 "1"
 "\x02"
 "11"
 "\x02"
 "11"
 "\x04"
 "1601"
 "\x01"
 "1"
 "\x06"
 "鍦板潃"
 "\x01"
 "2"
 "\x05\x00\x00\x10\xfe\x00\x00"
 "\""
 "\x00"

send buf61 54
 "2"
 "\x00\x00\x00\x03"
 "select `BlockNO` from `tb_blockinfo` where `ID`=6"

写关联语句:

lrs_save_searched_string("socket3",NULL,"Block_ID","LB/BIN=\\x01","RB/BIN=\\x03",8,0,-1);

执行发现关联的值不对。检查,发现传回的结果为:

 "\x01\x00\x00\x01"
 "\bK"
 "\x00\x00\x02\x03"
 "def\tsystem_db\n"
 "tb_tsbinfo\n"
 "tb_tsbinfo\fTskGuidebook\fTskGuidebook\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03"
 " "
 "\x00\x00\x00\x00"
 "A"
 "\x00\x00\x03\x03"
 "def\tsystem_db\n"
 "tb_tsbinfo\n"
 "tb_tsbinfo\aWork_ID\aWork_ID\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03\x00\x00\x00\x00\x00"
 "G"
 "\x00\x00\x04\x03"
 "def\tsystem_db\n"
 "tb_tsbinfo\n"
 "tb_tsbinfo\n"
 "WorkNum_ID\n"
 "WorkNum_ID\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03\x00\x00\x00\x00\x00"
 "I"
 "\x00\x00\x05\x03"
 "def\tsystem_db"
 "\x10"
 "tb_tskdetailinfo"
 "\x10"
 "tb_tskdetailinfo\bBatch ID"
 "\x02"
 "ID\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03"
 "!"
 "\x00\x00\x00\x00"
 "Q"
 "\x00\x00\x06\x03"
 "def\tsystem_db"
 "\x10"
 "tb_tskdetailinfo"
 "\x10"
 "tb_tskdetailinfo\tBatchName\tBatchName\f!"
 "\x00"
 ","
 "\x01\x00\x00\xfd\x00\x00\x00\x00\x00"
 "C"
 "\x00\x00"
 "\a"
 "\x03"
 "def\tsystem_db\n"
 "tb_tsbinfo\n"
 "tb_tsbinfo\bBlock_ID\bBlock_ID\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03\x00\x00\x00\x00\x00"
 "I"
 "\x00\x00"
 "\b"
 "\x03"
 "def\tsystem_db\ftb_blockinfo\ftb_blockinfo\tBlockName\tBlockName\f!"
 "\x00\x96\x00\x00\x00\xfd\x00\x00\x00\x00\x00"
 "G"
 "\x00\x00"
 "\t"
 "\x03"
 "def\tsystem_db\ftb_blockinfo\ftb_blockinfo\bModel_ID\bModel_ID\f?"
 "\x00"
 "\v"
 "\x00\x00\x00\x03\x00\x00\x00\x00\x00\x05\x00\x00"
 "\n"
 "\xfe\x00\x00"
 "\""
 "\x00\x16\x00\x00"
 "\v"
 "\x01"
 "2"
 "\x01"
 "3"
 "\x01"
 "2"
 "\x01"
 "2"
 "\x04"
 "8227"
 "\x02"
 "10"
 "\x03"
 "TWO"
 "\x01"
 "4"
 "\x15\x00\x00"
 "\f"
 "\x01"
 "2"
 "\x01"
 "3"
 "\x01"
 "2"
 "\x01"
 "2"
 "\x04"
 "8227"
 "\x01"
 "9"
 "\x03"
 "ONE"
 "\x01"
 "4"
 "\x18\x00\x00"
 "\r"
 "\x01"
 "3"
 "\x01"
 "1"
 "\x01"
 "1"
 "\x01"
 "1"
 "\x04"
 "0001"
 "\x01"
 "1"
 "\x06"
 "鍦板潃"
 "\x01"
 "2"
 "\x18\x00\x00\x0e\x01"
 "3"
 "\x01"
 "1"
 "\x01"
 "1"
 "\x01"
 "1"
 "\x04"
 "0001"
 "\x01"
 "4"
 "\x06"
 "鏁板瓧"
 "\x01"
 "2"
 "\x05\x00\x00\x0f\xfe\x00\x00"
 "\""
 "\x00"
经观查是改变了

在

 "\x04"
 "8227"
 "\x02"
 "10"
中\x04和\x02表示的是后面字符的位数,如是一位就是\x01,如是三位就是\x03。

这个查表返回的结果中有8列,我要取的是第一行第六列的值。

观查后将关联语句改为:

lrs_save_searched_string("socket3",NULL,"Block_ID","LB/BIN=\\v","RB/BIN=\\r",7,0,-1);

取得结果为:

\x012\x013\x012\x012\x048227\x0210\x03TWO\x014\x15\x00\x00\f\x012\x013\x012\x012\x048227\x019\x03ONE\x014\x18\x00\x00

我要取得的值在第六个“\”后。写语句:

char *Block;
int i;
int k;
int len;//要取值的长度
char Block_str[100];
char Block_len[5];
Block=lr_eval_string("<Block_ID>");

for(k=1;k<=6;)
 {
  i=i+1;

  if(Block[i]==‘x‘)

   k=k+1;
 }

strncpy(Block_len,Block+i-1,4);

lrs_hex_string_to_int(Block_len,1,&len);

strncpy(Block_str,Block+i+3,s);
lr_output_message ("Block= %s",Block_str);

取得想要的结果。整理脚本如下:

char *Block;
int i;
int k;
int len;//要取值的长度
char Block_str[100];
char Block_len[5];

lrs_save_searched_string("socket3",NULL,"Block_ID","LB/BIN=\\v","RB/BIN=\\r",7,0,-1);
Block=lr_eval_string("<Block_ID>");

//取得第六个x的位置

for(k=1;k<=6;)
 {
  i=i+1;

  if(Block[i]==‘x‘)

   k=k+1;
 }

strncpy(Block_len,Block+i-1,4);//截/x开始四位

lrs_hex_string_to_int(Block_len,1,&len);//转为int

strncpy(Block_str,Block+i+3,s);
lr_output_message ("Block= %s",Block_str);

在往下的脚本编写过程中发现还需要类似的工作,直接写了个函数,如下:

//str,被查找的字符串;n,第几个;c查找的字符
char *strn(char *str,int n,char c){
 int nlen;//要截取串的长度,十进制数
 char rstr[30]="";//截取出的串
 char *retu=NULL;//要返回的值
 char str_nlen[5]="";//要截取串的长度,字符
 int len=0;//str长度
 int i=0;//第几位,计数
 int k=1;//第几个,计数

// lr_output_message ("str= %s",str);
 len=strlen(str);//取得str的长度
 //查找第n个X的位置
 for(k=1;k<=n;)
  {
   i=i+1;
   if(str[i]==c)//判断字符是否为c
    k=k+1;
   if(i+3>len)
    return 0;//找到末尾条件还是不满足,返回空
  }

 strncpy(str_nlen,str+i-1,4);//截取\x0n,即我们所要取的值的长度,字符串

// lr_output_message ("str_nlen= %s",str_nlen);

 lrs_hex_string_to_int(str_nlen,1,&nlen);//将str_len转为十进制数,放入len 中

// lr_output_message ("要截取的长度为= %d",nlen);

 strncpy(rstr,str+i+3,nlen);//截取我们所需要的数据

// lr_output_message ("rstr为= %s",rstr);

 retu=rstr;

 return retu;
}

说一下strncpy函数,有两种格式

char *strncpy(char *dest, char *src, int n);

char *strncpy( strtemp,str+n , m )

--strtemp字符串变量,截取后的字符串存放处

--str 字符串变量,要截取的字符串

--n ,int 型,

-- str+n, 表示从第n 位开始截取字符串

--m,int型,表示截取m位
时间: 2024-10-15 05:41:37

LoadRunner截取字符串操作的相关文章

loadrunner脚本开发,如何截取字符串

在做性能测试的过程中,经常要根据实际场景修改loadrunner代码,目前我们的代码是使用C语言去完成的,这中间经常会用到对字符串的操作.但是在C语言中没有像Java一样方便提供丰富的函数库.以下是在实践中用到截取字符串的操作.灰常方便. 截取字符串DEMO:现有一个字符串:"ABCDEFG", 现要从第三位开始,连续取两位字符,即"DE"! 取值代码如下char array1[20];char array2[20];strcpy(array1,"ABCD

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$

LoadRunner中常用的字符串操作函数

LoadRunner中常用的字符串操作函数有:                strcpy(destination_string, source_string);               strcat(string_that_gets_appended, string_that_is_appended);51Testing软件测试网:J3~c:c[(wR%A2l               atoi(string_to_convert_to_int); //returns the integ

字符串操作 - 截取字符串长度代码段

提供一些项目中常用的字符串操作功能包括:截取字符串长度.输出转换.随机字符串.全角半角转换.字符集转换.邮箱格式验证.数字转文件大小. 截取字符串长度代码段: <span style="font-family:SimSun;font-size:12px;">/** * 截取长度 * @param unknown $str * @param number $start * @param unknown $length * @param string $charset * @p

Loadrunner脚本编程(4)-数据类型操作和字符串操作

http://www.360doc.com/content/10/0806/13/1698198_44078277.shtml 一,数据类型转换 没有使用过C编程的LoadRunner脚本编写者会发现在数据类型转化方面比较困难.下面介绍这方面的知识. 1.  相似函数的输出在不同的位置 象很多C函数一样,使用atoi函数的结果即为返回值 如intResult = atoi( charY ); 而:itoa的返回结果为第二个参数. itoa( intX, charY, 10); 第一个参数是需要转

Python 字符串操作,截取,长度

1.字符串操作: 字符串长度: s = "0123456"; slen = len(s); 字符串截取: print s[:-17:-1] #截取,逆序隔1个取一个字符 print s[:-17:-1] #截取,逆序隔1个取一个字符 print s[:-17:1] #截取0-倒数第17位,隔1个取一个字符 print s[:-17:-4] #截取倒数第17位-0,逆序隔4个取一个字符 print s[:-17:4] #截取0-倒数第17位,隔4个取一个字符 print s[:17:4]

面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”. 一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串-------------->按照字节[byte]截取操作字符串,先将String转换成byte类型 .2.汉字不可以截半----------------------------------

Java机试题目_怎样截取字符串

面试题1  怎样截取字符串 考题题干 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串.但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF"6,应该输出"我ABC",而不是"我ABC+汉的半个". 试题分析 本面试题容易产生困惑的是中文字符和英文字符,在这里需要考虑汉字和英文字符的占用字节数问题,中文字符占两个字节,英文字符占一个字节,理解了这