• C++解析一些我们需要的数据


    前言:

    我们经常会遇到一些Linux内核信息需要,比如一个wifi数据,中间是用tab键盘隔开的,然后每一行用换行符进行区分,如下所示的数据

    第一位置是:wifi名称 第二个位置是:信号强度 第三个位置是:信号类型2.4Ghz或者5Ghz 第四个位置是:加密类型 第五个类型是:MAC地址

    遇到这样的数据,我们比较常见的C函数解析是用while循环去匹配字符串里面的' '(tab键),' '(换行符号)等,然后用C标准库里面str函数,例如strncpy进行复制或者strstr去查找,类似于下面所示:

        int i, j ;
        i = 0;
        j = strlen(strIn) - 1;
        while(strIn[i] == ' ' || strIn[i] == '	')
                ++i;
    
        while(strIn[j] == ' ' || strIn[j] == '	')
                --j;
        strncpy(strOut, strIn + i , j - i + 1);
    

    那么我们怎么用C++解析呢,最近刚好解析了部分wifi信息,所以给大家分享哈这部分。

    作者:良知犹存

    转载授权以及围观:欢迎关注微信公众号:羽林君

    或者添加作者个人微信:become_me


    解析代码

    对应上面的wifi信息的表,我们看到了一行有五个数据,这时候打包收到了一个string类型的wifi信息。

    第一件事情,我们先确认好解析的范围,即知道最开始一位和最后一位,设置好recivemsg.begin 和 recivemsg.

    第二件事情,进行识别tab符号和换行符号之后进行分段

    第三件事情,把分好的数据塞到一个vector容器里面,然后因为每一行都有五个数据,所以我们就可以按照0~5一组的数据进行分发给各处。

    实际代码如下:

    vector<string> Parse_Wifi_List(string& msg)
    {
            vector<string> words;
            if(msg.empty())
                return words;
            string::iterator temp_p = msg.begin();
            string sepword;
            bool bit_true = false;
            while(temp_p != msg.end())
            {
                if(/* * temp_p == ' ' || */  * temp_p == '	' || * temp_p == '
    ')
                {
                    if(bit_true)
                    {
                        words.push_back(sepword);
                        PP_INFO("seword :%s",sepword.c_str());
                        sepword.clear();
                    }   
                    bit_true = false;
                    temp_p++;
                    continue;
                }
                else
                {
                    bit_true = true;
                    sepword += *temp_p;
                }
                if(*temp_p ++ == '')
                {
                    break;
                }
                // else
                // {
                //  PP_INFO("%d %d %c",msg.end(),*temp_p,*temp_p);
                // }
            }
            // for(auto point : words)
            // {
            //  printf(".%s
    ",point.c_str());
            // }
      		  //for(uint16_t i =0;i<words.size();i+=5)
    		    //{
    			     // printf("[]%s,%s
    ",words[i].c_str(),words[i+1].c_str(),words[i+3].c_str());
            //}
            return words;
        }
    

    使用此代码解析LOG如下:

    结语

    这就是我分享的一个简单的C++解析一些特殊符号的实践,如果大家有更好的想法和需求,也欢迎大家加我好友交流分享哈。


    作者:良知犹存,白天努力工作,晚上原创公号号主。公众号内容除了技术还有些人生感悟,一个认真输出内容的职场老司机,也是一个技术之外丰富生活的人,摄影、音乐 and 篮球。关注我,与我一起同行。

                                                    ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
    

    推荐阅读

    【1】C++的智能指针你了解吗?

    【2】嵌入式底层开发的软件框架简述

    【3】CPU中的程序是怎么运行起来的 必读

    【4】cartographer环境建立以及建图测试

    【5】设计模式之简单工厂模式、工厂模式、抽象工厂模式的对比

    本公众号全部原创干货已整理成一个目录,回复[ 资源 ]即可获得。

  • 相关阅读:
    Eclipse-将svn上的项目转化成相应的项目
    Maven-在eclipse创建maven项目
    Html-Css-div标签嵌套浮动div标签时无法撑开外部div的解决
    Html-Css-a标签的使用
    Jquery-获取父级元素parent
    Jquery-获取子元素children,find
    Jquery-获取同级标签prev,prevAll,next,nextAll
    Jquery-处理iframe的高度自适应
    Html-Css-iframe的自适应高度方案
    Html-Css-iframe的使用
  • 原文地址:https://www.cnblogs.com/conscience-remain/p/14761423.html
Copyright © 2020-2023  润新知