完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家晚上好,期末考试终于考完,我也有空写点东西了,回想起来也有两个星期没写文章了,现在分享个源码吧,我用在解析云端数据的,当然,我今天修改了一下的。
说的好像很高大上,但是其实是很简单的,当然效率估计也不高,差不多就行了。 作用:其实就是字符串的查找,然后提对应字符串的数据出来。 随便创建一组数组,模拟单片机中接收的数据。 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(“开始rn”); 然后找出搜寻字符串在数组中的位置,并且把字符串的后n位提取出来,我这是提取的是十进制数字。 1 rData = SearchNum(str,“AB=”,50,3,&data,4); 2 3 printf(“rData = %drn”,rData); 4 5 printf(“data = %drn”,data); 下面的这句代码含义是: 对比str字符串中的与“AB=”匹配的字符串(长度必须匹配),然后提取其后4位,并且将提取到的数据 data 保存出来。 注:str的内容是: 1str = aAB=123456789:;《=》?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^@ 1rData = SearchNum(str,“Aline-height:inherit;color:#D36363;”》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《j;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,“Aline-height:inherit;color:#D36363;”》50,3,&data,4); 提取9位: 1 rData = SearchNum(str,“Aline-height:inherit;color:#D36363;”》50,3,&data,9); 那个rData = 1;是字符串“AB=”的首地址。 最后 这个源码在我之前写的解析云端数据并不是这样子的,具体怎么用,看大家的需求了,而且源码有一个很大的bug,就是无法搜索到下一个与“AB=”一样的字符串,应用并不是很大。当然能改进啊,看大家来改进了,假如字符串长度不匹配,可以进行重新查找,只需在不匹配的地方往后移动seachLen就好了。假如有多个一样的字符串,这可以用一个链表来保存这些数据。如字符串在原字符串中的位置,其后面的数据等等。 test.c源码: 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《j;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(“开始rn”); 87 88 printf(“str = %srn”,str); 89 rData = SearchNum(str,“AB=”,50,3,&data,9); 90 91 printf(“rData = %drn”,rData); 92 93 printf(“data = %drn”,data); 94} |
|
|
|
只有小组成员才能发言,加入小组>>
2563 浏览 0 评论
1159浏览 2评论
762浏览 1评论
520浏览 0评论
273浏览 0评论
454浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 15:19 , Processed in 1.501531 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号