3

我有一个简单的问题,但无法在互联网上找到答案。我正在使用 Windows 的本机 WiFi API 并尝试获取接入点的 MAC。

在 WLAN_BSS_ENTRY 类型的结构中,有一个名为 dot11Bssid 的字段,它基本上是一个由 6 个无符号字符组成的数组。

我想要做的是将 MAC 地址放在 std::string 中,如下所示:'AA:AA:AA:AA:AA:AA'。

我可以像这样打印地址:

for (k = 0; k < 6; k++) 
{
    wprintf(L"%02X", wBssEntry->dot11Bssid[k]);
}

但我无法找到将这些值移动到具有上述格式的字符串的方法。

感谢您的帮助,如果您想知道我为什么要在字符串中使用它,我需要将它与以这种方式格式化的字符串进行比较。在此先感谢您的时间。

4

4 回答 4

14

与IO manipulators一起使用std::ostringstream(如前所述)。例如

#include <iostream>
#include <sstream>
#include <ios>
#include <iomanip>
#include <string>

int main()  
{
    unsigned char buf[] = { 0xAA, 0xD1, 0x09, 0x01, 0x10, 0xF1 };

    std::ostringstream s;
    s << std::hex << std::setfill('0') << std::uppercase
      << std::setw(2) << static_cast<int>(buf[0]) << ':'
      << std::setw(2) << static_cast<int>(buf[1]) << ':'
      << std::setw(2) << static_cast<int>(buf[2]) << ':'
      << std::setw(2) << static_cast<int>(buf[3]) << ':'
      << std::setw(2) << static_cast<int>(buf[4]) << ':'
      << std::setw(2) << static_cast<int>(buf[5]);

    std::cout << "[" << s.str() << "]\n";

    return 0;
}
于 2012-06-24T21:33:04.553 回答
1

使用 stringstream 并没有什么问题,但令人惊讶的是,人们会在不知道 swprintf 的情况下知道 wprintf。printf 是一整套函数,而不仅仅是 printf 和 wprintf:

​int printf( const char *format, ... );​
int fprintf( FILE *stream, const char *format, ... );
int sprintf( char *buffer, const char *format, ... );
int snprintf( char *buffer, int buf_size, const char *format, ... );
int wprintf( const wchar_t* format, ... );
int fwprintf( FILE *stream, const wchar_t* format, ... );
int swprintf( char *buffer, const wchar_t* format, ... );
​int vprintf( const char *format, va_list vlist );​
int vfprintf( FILE *stream, const char *format, va_list vlist );
int vsprintf( const char *buffer, const char *format, va_list vlist );
int vsnprintf( char *buffer, int buf_size, const char *format, va_list vlist );
int vwprintf( const wchar_t* format, va_list vlist );
int vfwprintf( FILE* stream, const wchar_t* format, va_list vlist );(2) 
int vswprintf( const wchar_t* buffer, const wchar_t* format, va_list vlist );
于 2012-06-24T22:11:30.993 回答
1

我假设你会使用类似于 sprintf 的东西,std::string 类包含一个转换构造函数,用于从 c-strings 移动到 std::strings。所以你可以 sprintf(),如果那是你正在寻找的。不过,您使用的是 wchar 类型,因此您可能需要考虑 swprintf() 。

类似的问题: std::string format like sprintf

于 2012-06-24T21:24:13.940 回答
0

使用一些这样的

int value = 0x1234;
char * temp = new char[100];
sprintf(temp, "0x%x", value);
std::string target(temp);
delete[] temp;
于 2014-11-25T08:19:42.393 回答