大家晚上好,今天分享个源码吧,用在解析云端数据的。
说的好像很高大上,但是其实是很简单的,当然效率估计也不高,差不多就行了。
作用:其实就是字符串的查找,然后提对应字符串的数据出来。
随便创建一组数组,模拟单片机中接收的数据。
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;i31 { 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}
全部0条评论
快来发表一下你的评论吧 !