0

我正在尝试获取周围所有可用无线网络的 MAC 地址。

目前正在使用: netsh wlan show networks mode=bssid | findstr BSSID

我得到它的输出(真正的 MAC 隐藏以保护隐私):

BSSID 1                 : 2c:ab:25:xx:xx:xx
BSSID 1                 : 00:22:2d:xx:xx:xx
BSSID 1                 : c4:3d:c7:xx:xx:xx
BSSID 1                 : 00:27:22:xx:xx:xx
BSSID 1                 : 84:c9:b2:xx:xx:xx
BSSID 1                 : 00:25:5e:xx:xx:xx
BSSID 1                 : 00:06:5a:xx:xx:xx
BSSID 2                 : 00:06:5a:xx:xx:xx
BSSID 1                 : 00:06:5a:xx:xx:xx
BSSID 2                 : 00:06:5a:xx:xx:xx
BSSID 1                 : 00:06:5a:xx:xx:xx
BSSID 2                 : 00:06:5a:xx:xx:xx
BSSID 1                 : 00:06:5a:xx:xx:xx
BSSID 2                 : 00:06:5a:xx:xx:xx
BSSID 3                 : 00:25:5e:xx:xx:xx
BSSID 4                 : 00:25:5e:xx:xx:xx
BSSID 5                 : 00:25:5e:xx:xx:xx
BSSID 1                 : 00:27:22:xx:xx:xx
BSSID 1                 : 00:27:22:xx:xx:xx
BSSID 1                 : fc:b0:c4:xx:xx:xx
BSSID 1                 : fc:b0:c4:xx:xx:xx

我需要实现一个正则表达式,它只能输出 MAC 地址(即每行的最后 17 个字符)需要将 MAC 地址存储在 C++ 中的数组中。
 
我当前的代码是这样获取输出的:

#include <iostream>
#include <string>
#include <stdio.h>  // for _popen() and _pclose()
using namespace std;

    int main()
    {
        char buff[512];
        buff[0]=0;
        string cmd="netsh wlan show networks mode=bssid | findstr BSSID";
        FILE *fpipe = _popen(cmd.c_str(),"rt");

        if(fpipe==NULL)
            cout<<"Failed to open"<<endl;
        else
            cout<<"Opened pipe successfully";
        while(fgets(buff,sizeof(buff),fpipe)!=NULL){
            cout<<buff<<endl;
        }

        _pclose(fpipe);
    }

有人可以为我提供一个代码片段来实现提升正则表达式以仅获取数组中的 MAC 地址吗?我的意图是将这些 MAC 地址传递给谷歌地理定位 API 并获取位置。

有任何想法吗?

谢谢!

4

3 回答 3

1

哦——Kayasax 就这么近!问题是输出有一个领先的空间......

FOR /f "tokens=1*delims=:" %%a IN (c:\temp\mac.txt) DO (
 FOR /f "tokens=*" %%c IN ("%%b") DO ECHO %%c)

应该删除那个空间。

netsh以Kayasax建议的方式替换文件名的命令也应该适用于此......

FOR /f "tokens=1*delims=:" %%a IN (
'netsh wlan show networks mode=bssid ^| findstr BSSID') DO (
 FOR /f "tokens=*" %%c IN ("%%b") DO ECHO %%c)

你知道——Kayasax 提倡的 netsh... 命令。

于 2014-01-20T09:37:58.040 回答
0

您可以使用它在字符处“拆分”字符串:(假设您可以将命令的输出保存到文件 c:\temp\mac.txt )

for /f "tokens=2,* delims=:" %%i in (c:\temp\mac.txt) do echo %%i:%%j

或者你可以做(​​我无法测试)

for /f "tokens=2,* delims=:" %%i in ('netsh wlan show networks mode=bssid ^| findstr BSSID') do echo %%i:%%j
于 2014-01-20T08:43:40.960 回答
0

我终于设法让它工作了。这是我使用的代码片段:

#include <iostream>
#include <string>
#include <stdio.h>  // for _popen() and _pclose()
#include <regex>
#include <iterator>

using namespace std;

int main()
{
    char buff[512];
    buff[0]=0;
    string MacOutput;

    string cmd="netsh wlan show networks mode=bssid | findstr BSSID";
    FILE *fpipe = _popen(cmd.c_str(),"rt");

    if(fpipe==NULL)
        cout<<"Failed to open"<<endl;

    while(fgets(buff,sizeof(buff),fpipe)!=NULL){
        string temp = string(buff);
        MacOutput.append(temp);
    }
    _pclose(fpipe);

    regex mac_regex("([0-9a-f]{2}[:-]){5}[0-9a-f]{2}");

    auto words_begin = 
        sregex_iterator(MacOutput.begin(), MacOutput.end(), mac_regex);
    auto words_end = sregex_iterator();
    int j=0;
    for (sregex_iterator i = words_begin; i != words_end; ++i) {
        smatch match = *i;                                                 
        string match_str = match.str(); //Can store the outputs in an array here!
        cout << match_str << '\n';
    }   
}

感谢所有帮助过的人!以及我在整个stackoverflow中使用过的那些片段!

于 2014-01-21T12:25:48.310 回答