2012-06-24 3 views
3

간단한 질문이 있지만 인터넷에서 답변을 찾을 수 없습니다. Windows의 기본 WiFi API를 사용 중이고 액세스 포인트의 MAC을 얻으려고합니다.C++ 문자열에 16 진수 값 저장

WLAN_BSS_ENTRY 유형의 구조 내부에는 기본적으로 6 개의 서명되지 않은 문자 배열 인 dot11Bssid라는 필드가 있습니다.

내가하고 싶은 것은 'AA : AA : AA : AA : AA : AA : AA'와 같은 std :: string에 MAC 주소를 갖는 것입니다.

나는이 같은 ADRESS을 인쇄 할 수 있습니다

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

하지만 위에서 식별 형식의 문자열이 값을 이동하는 방법을 찾을 수 없습니다입니다.

왜 내가 문자열에서 이것을 원하는지 궁금하다면, 나는 그 방법으로 포맷 된 문자열과 비교할 필요가 있습니다. 미리 감사드립니다.

+4

과 같은 몇 가지를 사용 : printf와는 단지의 printf와 wprintf하지 기능의 전체 제품군입니다. –

+0

stringstreams를 알고 있지만 문제는 포맷팅과 관련된 것이 었습니다. 몇 가지 기본적인 시험을하고 이상한 문자를 얻었습니다. swprintf 또는 sprintf로 이동하겠습니다. 감사! – unbekant

답변

14

사용 IO manipulators와 (이미 주석으로) std::ostringstream. For example :

#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; 
} 
+0

그것은 std :: ostringstream과 잘 작동하며,이 질문에 대한 답을 구하는 사람들은 정말 유용 할 것이므로 정답으로 표시 될 것입니다! 감사. – unbekant

+1

이것은 C++의 "올바른 방법"이므로 upvote입니다. 약간의 foreach 나 range-based를 사용하여 약간의 개선이있을 수 있습니다. –

1

sprintf와 비슷한 것을 사용한다고 가정합니다. std :: string 클래스에는 c-strings에서 std :: string으로 이동하는 변환 생성자가 들어 있습니다. 그게 당신이 찾고있는 것이라면 sprintf() 할 수 있습니다. 그래도 wchar 유형을 사용하고 있으므로 대신 swprintf()를 고려할 수 있습니다.

비슷한 질문 : std::string formatting like sprintf

+0

나는 그것을 시도해보고 내가 어떻게했는지에 관해 말할 것이다. 감사! – unbekant

+0

내가 이것에 주석을 달았을 때'std :: stringstream'을 잊어 버렸습니다. 그 경로를가는 것이 더 좋은 생각 일 수 있습니다. 비용을 불문하고 일하게 할 수 있기를 바랍니다. :) – TReed0803

+0

그것은 두 가지 방법으로 잘 작동하지만 더 나은 것 같습니다 std :: stringstream 함께 유지할 것이다. 사이트의 이익을 위해 나는 다른 하나를 정확하다고 기록하지만 어쨌든 감사합니다. :) – unbekant

1

이 이제 stringstream을 사용하여 아무 문제가 없다, 그러나 swprintf의 의식하지 않고 종류의 하나가 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); 
+0

마지막으로 C/C++을 다루었 기 때문에 오랜 시간이 걸렸으며 조금 녹슬었지만 printf 계열은 알고있었습니다. – unbekant

0

내가`표준 : stringstream`을 조사 것이라고

int value = 0x1234; 
char * temp = new char[100]; 
sprintf(temp, "0x%x", value); 
std::string target(temp); 
delete[] temp;