来源:物联网IoT开发
今天分享个源码吧,用在解析云端数据的。
说的好像很高大上,但是其实是很简单的,当然效率估计也不高,差不多就行了。作用:其实就是字符串的查找,然后提对应字符串的数据出来。
随便创建一组数组,模拟单片机中接收的数据。1 char j = '1';
2 str[0] = 'a';
3 str[1] = 'A';
4 str[2] = 'B';
5 str[3] = '=';
6 for(i=4;i<50;i++)
7 {
8 str[i] = j;
9 j++;
10 }
11 printf('开始
');
然后找出搜寻字符串在数组中的位置,并且把字符串的后n位提取出来,我这是提取的是十进制数字。1 rData = SearchNum(str,'AB=',50,3,&data,4);
2
3 printf('rData = %d
',rData);
4
5 printf('data = %d
',data);
下面的这句代码含义是:
对比str字符串中的与“AB=”匹配的字符串(长度必须匹配),然后提取其后4位,并且将提取到的数据 data 保存出来。
注:str的内容是:1str = aAB=123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^@1rData = SearchNum(str,'AB=',50,3,&data,4);
源码的实现:1u16 SearchNum( u8 *inBuf,u8 *searchBuf, u16 dataLen,u8 seachLen,unsigned long *data,u8 seachNumLen)
2{
3 u16 i,rData;
4 u8 useData =0 ;
5 i =0;
6//查找第一个字母
7 for(; i!= dataLen; i++)
8 {
9 if(inBuf[i] == searchBuf[0])
10 {
11 break;
12 }
13 }
14//比对长度
15 rData =ibuffercmp(&inBuf[i], searchBuf, seachLen);
16 if(rData == 0)
17 {
18 *data = GetSearchNum(&inBuf[i+seachLen],seachNumLen);
19
20 return rData+i;
21
22 }
23 return 0;
24}
对比字符串长度的源码:
这种很简单啦!!!1//检测buf1和buf2在规定的长度内是否相等
2uint8_t ibuffercmp(uint8_t* buffer1, uint8_t* buffer2, uint16_t len)
3{
4 while(len--)
5 {
6 if(*buffer1 != *buffer2)
7 {
8 return 1;
9 }
10 buffer1++;
11 buffer2++;
12 }
13 return 0;
14}
还有一个内部调用的函数:
用来将字符转换成十进制的数字,根据要提取多少位来方便提取。1static unsigned long GetSearchNum(u8 *inBuf,u16 seachLen)
2{
3 int i,k,j=seachLen;
4 u8 data1[seachLen];
5 unsigned long data2=0;
6 unsigned long num = 1;
7 for(i=0;i
8 {
9 if((*inBuf >= '0')&&(*inBuf <= '9'))
10 {
11 num = 1;
12 k = seachLen-1;
13 for(k;k>0;k--)
14 num *= 10;
15 data2 += (*inBuf-'0')*num;
16 seachLen--;
17 }
18 inBuf++;
19 }
20 return data2;
21}
测试结果:(提取4位)1 rData = SearchNum(str,'AB=',50,3,&data,4);
提取9位:1 rData = SearchNum(str,'AB=',50,3,&data,9);
那个rData = 1;是字符串“AB=”的首地址。
最后
这个源码在我之前写的解析云端数据并不是这样子的,具体怎么用,看大家的需求了,而且源码有一个很大的bug,就是无法搜索到下一个与“AB=”一样的字符串,应用并不是很大。当然能改进啊,看大家来改进了,假如字符串长度不匹配,可以进行重新查找,只需在不匹配的地方往后移动seachLen就好了。假如有多个一样的字符串,这可以用一个链表来保存这些数据。如字符串在原字符串中的位置,其后面的数据等等。
附上源码1#include 'stdio.h'
2
3typedef unsigned char uint8_t;
4typedef unsigned short int uint16_t;
5
6typedef unsigned char u8;
7typedef unsigned short int u16;
8
9//检测buf1和buf2在规定的长度内是否相等
10uint8_t ibuffercmp(uint8_t* buffer1, uint8_t* buffer2, uint16_t len)
11{
12 while(len--)
13 {
14 if(*buffer1 != *buffer2)
15 {
16 return 1;
17 }
18 buffer1++;
19 buffer2++;
20 }
21 return 0;
22}
23
24static unsigned long GetSearchNum(u8 *inBuf,u16 seachLen)
25{
26 int i,k,j=seachLen;
27 u8 data1[seachLen];
28 unsigned long data2=0;
29 unsigned long num = 1;
30 for(i=0;i
31 {
32 if((*inBuf >= '0')&&(*inBuf <= '9'))
33 {
34 num = 1;
35 k = seachLen-1;
36 for(k;k>0;k--)
37 num *= 10;
38 data2 += (*inBuf-'0')*num;
39 seachLen--;
40 }
41 inBuf++;
42 }
43 return data2;
44}
45
46u16 SearchNum( u8 *inBuf,u8 *searchBuf, u16 dataLen,u8 seachLen,unsigned long *data,u8 seachNumLen)
47{
48 u16 i,rData;
49 u8 useData =0 ;
50 i =0;
51//查找第一个字母
52 for(; i!= dataLen; i++)
53 {
54 if(inBuf[i] == searchBuf[0])
55 {
56 break;
57 }
58 }
59//比对长度
60 rData =ibuffercmp(&inBuf[i], searchBuf, seachLen);
61 if(rData == 0)
62 {
63 *data = GetSearchNum(&inBuf[i+seachLen],seachNumLen);
64
65 return rData+i;
66
67 }
68 return 0;
69}
70
71int main()
72{
73 int rData,i;
74 unsigned long data;
75 u8 str[50];
76 char j = '1';
77 str[0] = 'a';
78 str[1] = 'A';
79 str[2] = 'B';
80 str[3] = '=';
81 for(i=4;i<50;i++)
82 {
83 str[i] = j;
84 j++;
85 }
86 printf('开始
');
87
88 printf('str = %s
',str);
89 rData = SearchNum(str,'AB=',50,3,&data,9);
90
91 printf('rData = %d
',rData);
92
93 printf('data = %d
',data);
94}