打印获取 MAC 地址函数的 std::string 时出现意外输出?

Posted

技术标签:

【中文标题】打印获取 MAC 地址函数的 std::string 时出现意外输出?【英文标题】:Unexpected output when printing std::string of my Get MAC Address function? 【发布时间】:2015-08-02 11:07:36 【问题描述】:

使用 VC++,当我获得本地系统的 MAC 地址时,它会给我一个十六进制代码。我需要将其转换为 std::string 以便我可以在代码中的其他位置使用它。 但我无法正确获得它。 我知道我一定错过了关于 C++ 中字符串的一个非常基本的概念,请在这里帮助我。

这是我的代码:-

void getMACAddr()

CCLOG("getMACAddr 1");
IP_ADAPTER_INFO *info = NULL, *pos;
DWORD size = 0;

GetAdaptersInfo(info, &size);

info = (IP_ADAPTER_INFO *)malloc(size);

GetAdaptersInfo(info, &size);
CCLOG("getMACAddr 2");

for (pos = info; pos != NULL; pos = pos->Next) 

    std::stringstream ss;
    CCLOG("getMACAddr 3");
    CCLOG("\n%s\n\t", pos->Description);
    CCLOG("HEX = :%2.2x", pos->Address[0]);
    ss << pos->Address[0];
    for (int i = 1; i < pos->AddressLength; i++)
    
        CCLOG("HEX = :%2.2x", pos->Address[i]);
        ss << pos->Address[i];
    
    std::string tS = ss.str();
    CCLOG("%s", tS.c_str());

free(info);



这是我的输出:-

getMACAddr 1
'prog.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dhcpcsvc.dll'.Cannot find or open the PDB file.
getMACAddr 2
getMACAddr 3

Bluetooth Device (Personal Area Network)

HEX = :08
HEX = :3e
HEX = :8e
HEX = :aa
HEX = :37
HEX = :52
tS == >??7R

如您所见。

最后一行输出("tS == >??7R") 很奇怪。

我应该怎么做才能在单个字符串中获取整个地址?

【问题讨论】:

由于这是用cocos2d-x 标记的,所以提个建议:GetAdaptersInfo 是 Windows API 函数,不会存在于移动设备上。 @Thomas:我知道。但我的程序仅适用于 Windows,不适用于移动设备。所以不用担心 08 无法打印,3e &gt;8e aa 没有字形(? ?),37752@987654333333 【参考方案1】:

IP_ADAPTER_INFO::AddressBYTE 的数组,因此您可能希望将字节转换为十六进制表示法,而不是将它们像字符一样填充到字符串中。

类似这样的:

#include <iomanip>

ss << std::hex << std::setfill('0') << std::setw(2);
for (int i = 0; i < pos->AddressLength; i++) 
  ss << (int) pos->Address[i];

std::string tS = ss.str();

【讨论】:

以上是关于打印获取 MAC 地址函数的 std::string 时出现意外输出?的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# 如何优雅的获取 Mac OS 系统 IP 地址?

如何优雅的获取 Mac OS 系统 IP 地址?

Linux通过c语言函数管理网络-----获取/修改IP和MAC地址

iOS 蓝牙获取MAC地址

linux内核空间能正常显示mac地址,到了用户空间就显示有问题

PowerBulider获取计算机mac地址