LoadRunner截取字符串操作 在使用LoadRunner winsockets协议写脚本,遇到下面问题: 在接收到的查询数据库的结果中我要取红色部份用于下面的select recv buf60 769 "x01x00x00x01" "K" "x00x00x02x03" "def system_db " "tb_tsbinfo " "tb_tsbinfofTskGuidebookfTskGuidebookf?" "x00" "v" "x00x00x00x03" " " "x00x00x00x00" "A" "x00x00x03x03" "def system_db " "tb_tsbinfo " "tb_tsbinfo" "x07" "Work_ID" "x07" "Work_IDf?" "x00" "v" "x00x00x00x03x00x00x00x00x00" "G" "x00x00x04x03" "def system_db " "tb_tsbinfo " "tb_tsbinfo " "WorkNum_ID " "WorkNum_IDf?" "x00" "v" "x00x00x00x03x00x00x00x00x00" "I" "x00x00x05x03" "def system_db" "x10" "tb_tskdetailinfo" "x10" "tb_tskdetailinfoBatch ID" "x02" "IDf?" "x00" "v" "x00x00x00x03" "!" "x00x00x00x00" "Q" "x00x00x06x03" "def system_db" "x10" "tb_tskdetailinfo" "x10" "tb_tskdetailinfo BatchName BatchNamef!" "x00" "," "x01x00x00xfdx00x00x00x00x00" "C" "x00x00x07x03" "def system_db " "tb_tsbinfo " "tb_tsbinfoBlock_IDBlock_IDf?" "x00" "v" "x00x00x00x03x00x00x00x00x00" "I" "x00x00" "" "x03" "def system_dbftb_blockinfoftb_blockinfo BlockName BlockNamef!" "x00x96x00x00x00xfdx00x00x00x00x00" "G" "x00x00" " " "x03" "def system_dbftb_blockinfoftb_blockinfoModel_IDModel_IDf?" "x00" "v" "x00x00x00x03x00x00x00x00x00x05x00x00" " " "xfex00x00" """ "x00x15x00x00" "v" "x01" "5" "x01" "4" "x01" "7" "x01" "7" "x04" "8227" "x01" "6" "x03" "DAY" "x01" "3" "x15x00x00" "f" "x01" "5" "x01" "4" "x01" "7" "x01" "7" "x04" "8227" "x01" "5" "x03" "NEW" "x01" "3" "x18x00x00" " " "x01" "6" "x01" "1" "x01" "5" "x01" "5" "x04" "0502" "x01" "4" "x06" "鏁板瓧" "x01" "2" "x1ax00x00x0ex01" "9" "x01" "1" "x02" "11" "x02" "11" "x04" "1601" "x01" "4" "x06" "鏁板瓧" "x01" "2" "x1ax00x00x0fx01" "9" "x01" "1" "x02" "11" "x02" "11" "x04" "1601" "x01" "1" "x06" "鍦板潃" "x01" "2" "x05x00x00x10xfex00x00" """ "x00" send buf61 54 "2" "x00x00x00x03" "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); 执行发现关联的值不对。检查,发现传回的结果为: "x01x00x00x01" "K" "x00x00x02x03" "def system_db " "tb_tsbinfo " "tb_tsbinfofTskGuidebookfTskGuidebookf?" "x00" "v" "x00x00x00x03" " " "x00x00x00x00" "A" "x00x00x03x03" "def system_db " "tb_tsbinfo " "tb_tsbinfoaWork_IDaWork_IDf?" "x00" "v" "x00x00x00x03x00x00x00x00x00" "G" "x00x00x04x03" "def system_db " "tb_tsbinfo " "tb_tsbinfo " "WorkNum_ID " "WorkNum_IDf?" "x00" "v" "x00x00x00x03x00x00x00x00x00" "I" "x00x00x05x03" "def system_db" "x10" "tb_tskdetailinfo" "x10" "tb_tskdetailinfoBatch ID" "x02" "IDf?" "x00" "v" "x00x00x00x03" "!" "x00x00x00x00" "Q" "x00x00x06x03" "def system_db" "x10" "tb_tskdetailinfo" "x10" "tb_tskdetailinfo BatchName BatchNamef!" "x00" "," "x01x00x00xfdx00x00x00x00x00" "C" "x00x00" "a" "x03" "def system_db " "tb_tsbinfo " "tb_tsbinfoBlock_IDBlock_IDf?" "x00" "v" "x00x00x00x03x00x00x00x00x00" "I" "x00x00" "" "x03" "def system_dbftb_blockinfoftb_blockinfo BlockName BlockNamef!" "x00x96x00x00x00xfdx00x00x00x00x00" "G" "x00x00" " " "x03" "def system_dbftb_blockinfoftb_blockinfoModel_IDModel_IDf?" "x00" "v" "x00x00x00x03x00x00x00x00x00x05x00x00" " " "xfex00x00" """ "x00x16x00x00" "v" "x01" "2" "x01" "3" "x01" "2" "x01" "2" "x04" "8227" "x02" "10" "x03" "TWO" "x01" "4" "x15x00x00" "f" "x01" "2" "x01" "3" "x01" "2" "x01" "2" "x04" "8227" "x01" "9" "x03" "ONE" "x01" "4" "x18x00x00" " " "x01" "3" "x01" "1" "x01" "1" "x01" "1" "x04" "0001" "x01" "1" "x06" "鍦板潃" "x01" "2" "x18x00x00x0ex01" "3" "x01" "1" "x01" "1" "x01" "1" "x04" "0001" "x01" "4" "x06" "鏁板瓧" "x01" "2" "x05x00x00x0fxfex00x00" """ "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); 取得结果为: x012x013x012x012x048227x0210x03TWOx014x15x00x00fx012x013x012x012x048227x019x03ONEx014x18x00x00 我要取得的值在第六个“”后。写语句: 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位