來源:物聯(lián)網(wǎng)IoT開發(fā)
今天分享個源碼吧,用在解析云端數(shù)據(jù)的。
說的好像很高大上,但是其實是很簡單的,當然效率估計也不高,差不多就行了。 作用:其實就是字符串的查找,然后提對應(yīng)字符串的數(shù)據(jù)出來。 隨便創(chuàng)建一組數(shù)組,模擬單片機中接收的數(shù)據(jù)。 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('開始 ');
然后找出搜尋字符串在數(shù)組中的位置,并且把字符串的后n位提取出來,我這是提取的是十進制數(shù)字。
1 rData = SearchNum(str,'AB=',50,3,&data,4); 2 3 printf('rData = %d ',rData); 4 5 printf('data = %d ',data);
下面的這句代碼含義是: 對比str字符串中的與“AB=”匹配的字符串(長度必須匹配),然后提取其后4位,并且將提取到的數(shù)據(jù) data 保存出來。 注:str的內(nèi)容是: 1str = aAB=123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^@
1rData = SearchNum(str,'AB=',50,3,&data,4);
源碼的實現(xiàn): 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在規(guī)定的長度內(nèi)是否相等 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}
還有一個內(nèi)部調(diào)用的函數(shù):
用來將字符轉(zhuǎn)換成十進制的數(shù)字,根據(jù)要提取多少位來方便提取。 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}
測試結(jié)果:(提取4位) 1 rData = SearchNum(str,'AB=',50,3,&data,4);

提取9位: 1 rData = SearchNum(str,'AB=',50,3,&data,9);

那個rData = 1;是字符串“AB=”的首地址。 最后 這個源碼在我之前寫的解析云端數(shù)據(jù)并不是這樣子的,具體怎么用,看大家的需求了,而且源碼有一個很大的bug,就是無法搜索到下一個與“AB=”一樣的字符串,應(yīng)用并不是很大。當然能改進啊,看大家來改進了,假如字符串長度不匹配,可以進行重新查找,只需在不匹配的地方往后移動seachLen就好了。假如有多個一樣的字符串,這可以用一個鏈表來保存這些數(shù)據(jù)。如字符串在原字符串中的位置,其后面的數(shù)據(jù)等等。 附上源碼 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在規(guī)定的長度內(nèi)是否相等 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('開始 '); 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}
|