最近发现一个很恶心的东西就是,如果你在LR-socket协议下写脚本的时候,会遇到一个问题,普通的十六进制格式LR根本不识别。
例: 获取本地时间,并将时间戳转为十六进制后,再转为LR可识别的十六进制参数
假设这是我们获取之后的16进制字符串(如何获取本地时间戳可以参考我的上篇文章):31 36 37 33 32 34 39 33 33 33
在LR中,这一类的字符串需要转为 \x31\x36\x37\x33\x32\x34\x39\x33\x33\x33 这种格式才能被正确识别。在字数少的时候,我们可以手动修改,但是我遇到的问题是这个字符串是参数化之后保存的时间戳,那如何将这个16进制的时间戳整合到报文中发送呢
首先我们要写一个将时间戳转为普通十六进制的方法:
void string2hexString(char* input, char* output)
{
int loop;
int i;
i=0;
loop=0;
while(input[loop] != '\0')
{
sprintf((char*)(output+i),"%02X", input[loop]);
loop+=1;
i+=2;
}
output[i++] = '\0';
}
这个方法要放在你脚本最前面的#include "lrs.h" 下
别忘了定义变量要在你脚本开始之前,而不是再脚本中定义
然后我们将普通十六进制转为可识别的十六进制,并输出检查是否正确,
lrs_startup(257);
t1=time();//获取当前系统时间
sprintf(a,"%d",t1);//将t1存进数组a
lr_save_string(a,"time2");//将数组a存成字符串参数time2
lr_output_message("当前时间戳是%s",lr_eval_string("{time2}"));//获取当前时间戳单位至秒
string2hexString(a,hex_str);
lr_output_message("转换为16进制字符串为: %s\n", lr_eval_string(hex_str));
psrcs=lr_eval_string(hex_str);
z=0;
//将16进制字符串转为lr发送的16进制格式,比如:"\xDB"
for(j=0;*psrcs;j++)
{
strcpy(dsts,"\\x");
strncat(dsts,psrcs,2);
psrcs+=2;
for (k=0;k<strlen(dsts);k++) {
buff[z++]=dsts[k];
}
}
lr_output_message("转换为可发送的16进制: %s",buff);
运行脚本,查看结果
大功告成~