从指定字符串里提需要的数据

#include <stdio.h>

#include <string.h>

 

//函数作用:从指定字符串里提取你要的数据

//参数说明:

//pSourc:源串指针

//pHeaderTail:起始和结尾标识字符,这里只能包含两个字符

//pResult:存放结果数据的指针

int ExtractData(const char *pSourc, const char *pHeaderTail, char *pResult)

{

 //大概思路:遍历源串,查找开始和结束标记,并且记下两个位置

 //遍历结束之后如果开始和结束标记都有,将数据拷贝到结果中

 //两者少一,都认为是无效数据

 if (pSourc == NULL || pHeaderTail == NULL)

 {

  return -1;

 }

 

 const char *pTmp = pSourc;

 int iPointerIndex = 0;

 int iFindHeader = 0;

 int iFindTail = 0;

 int iStartIndex = 0;

 int iEndIndex = 0;

 

 while(*pTmp != NULL)

 {

  //如果还没有找到起始标记,就查找起始标记

  if (!iFindHeader)

  {

   if (*pTmp == *pHeaderTail)

   {

    if (*(pTmp + 1) != NULL && *(pTmp + 1) == *(pHeaderTail + 1))

    {

     //如果找到起始标记,记下位置

     iFindHeader = 1;

     iStartIndex = iPointerIndex + 2;//拷贝数据的时候从标记之后拷贝,所以加2

 

     ++iPointerIndex;

     ++pTmp;

     continue;

    }   

   }

  }

  //如果没有找到结束标记,查找结束标记

  if (!iFindTail)

  {

   if (*pTmp == *pHeaderTail)

   {

    if (*(pTmp + 1) != NULL && *(pTmp + 1) == *(pHeaderTail + 1))

    {

     //找到,记下位置

     iFindTail = 1;

     iEndIndex = iPointerIndex;//用结束标记减开始标记再减1就是数据长度

 

     ++iPointerIndex;

     ++pTmp;

     continue;

    }   

   }

  } 

 

  ++iPointerIndex;

  ++pTmp;

 }

 //起始和结束标记都找到,拷贝数据

 if (iFindHeader && iFindTail)

 {

  strncpy(pResult , pSourc + iStartIndex, iEndIndex - iStartIndex -  1);

  return 0;

 }

 

 //否则,直接返回失败

 return -1;

}

 

//以16进制形式输出数据

void OutPutHex(const char *pData)

{

 int i = 0; 

 for (;i < strlen(pData); ++i)

 {

  printf("0x%02X ", pData[i]);

 } 

 printf("\n");

}

 

int main()

{

 int i = 0;

 //保存结果数据的数组

 char cResult[20] = {0};

 //三组测试数据,注意要以\0结尾

 char pSource[] = {0x0D,0x0A,0x01,0x02,0x03,0x04,0x0D,0x0A, 0x00};

 char pSource1[] = {0x0D,0x0A,0x01,0x02,0x03,0x04,0x0D, 0x00};

 char pSource2[] = {0x01,0x02,0x03,0x04,0x0D, 0x00};

 //标记字符串,两个字符

 char pHeaderTail[] = {0x0D,0x0A}; 

 

 //开始测试

 printf("Data is:\n");

 OutPutHex(pSource);

 if(0 == ExtractData(pSource, pHeaderTail, cResult))

 {

  printf("Result is:\n");

  OutPutHex(cResult);

 }

 else

 {

  printf("Data is not complete.\n");

 }

 

 printf("Data is:\n");

 OutPutHex(pSource1);

 if(0 == ExtractData(pSource1, pHeaderTail, cResult))

 {

  printf("Result is:\n");

  OutPutHex(cResult);

  memset(cResult, 0 , 20);

 }

 else

 {

  printf("Data is not complete.\n");

 }

 

 printf("Data is:\n");

 OutPutHex(pSource2);

 if(0 == ExtractData(pSource2, pHeaderTail, cResult))

 {

  printf("Result is:\n");

  OutPutHex(cResult);

  memset(cResult, 0 , 20);

 }

 else

 {

  printf("Data is not complete.\n");

 }

 

 

 return 0;

}

 

结果截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值