zoukankan      html  css  js  c++  java
  • 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】设计模式之简单工厂模式、工厂模式、抽象工厂模式的对比

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

  • 相关阅读:
    基于Typescript和Jest刷题环境搭建与使用
    一些惊艳到我的运维实施技巧和思路
    Zabbix 5.0:监控MySQL出现的问题
    Linux防火墙IPtables配置策略思路
    聊聊二维码
    如何创建SQLite数据库
    PLC工程师学会编程,是一种什么样的体验?
    让你的上位机程序独占鳌头
    使用delve调试golang
    指纹登录是怎么跑起来的
  • 原文地址:https://www.cnblogs.com/conscience-remain/p/14761423.html
Copyright © 2011-2022 走看看