2016-06-22 9 views
-3

Ich habe versucht, es für die letzten 3 Tage zu beheben, und versuchte viele Optionen, aber nicht zur Arbeit zu kommen. Ich habe den folgenden Code in C++.Wie fügt man "% .2X" Daten in Char Array oder String in C (vorzugsweise) oder C++?

#include <winsock2.h> 
    #include <iphlpapi.h> 
    #include<stdio.h> 
    #include <stdlib.h> 
    #include <typeinfo> 
    #include <string> 


    // Link with Iphlpapi.lib 
    #pragma comment(lib, "IPHLPAPI.lib") 
    #define _CRT_SECURE_NO_WARNINGS 
    #define WORKING_BUFFER_SIZE 15000 
    #define MAX_TRIES 3 

    #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) 
    #define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) 

    /* Note: could also use malloc() and free() */ 

    int __cdecl main(int argc, char **argv) 
    { 

     /* Declare and initialize variables */ 

     DWORD dwSize = 0; 
     DWORD dwRetVal = 0; 

     unsigned int i = 0; 

     // Set the flags to pass to GetAdaptersAddresses 
     ULONG flags = GAA_FLAG_INCLUDE_PREFIX; 

     // default to unspecified address family (both) 
     ULONG family = AF_UNSPEC; 

     LPVOID lpMsgBuf = NULL; 

     PIP_ADAPTER_ADDRESSES pAddresses = NULL; 
     ULONG outBufLen = 0; 
     ULONG Iterations = 0; 

     PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL; 
     PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL; 
     PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL; 
     PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL; 
     IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL; 
     IP_ADAPTER_PREFIX *pPrefix = NULL; 

     // Allocate a 15 KB buffer to start with. 
     outBufLen = WORKING_BUFFER_SIZE; 
     std::string str; 
     char Buffer[255]; 
     do { 

      pAddresses = (IP_ADAPTER_ADDRESSES *)MALLOC(outBufLen); 
      if (pAddresses == NULL) { 
       printf 
        ("Memory allocation failed for IP_ADAPTER_ADDRESSES   struct\n"); 
       //exit(1); 
      } 

      dwRetVal = 
       GetAdaptersAddresses(family, flags, NULL, pAddresses,   &outBufLen); 

      if (dwRetVal == ERROR_BUFFER_OVERFLOW) { 
       FREE(pAddresses); 
       pAddresses = NULL; 
      } 
      else { 
       break; 
      } 

      Iterations++; 

     } while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations <   MAX_TRIES)); 

     if (dwRetVal == NO_ERROR) { 
      // If successful, output some information from the data we   received 
      pCurrAddresses = pAddresses; 
      while (pCurrAddresses) { 

       if (wcscmp(pCurrAddresses->FriendlyName, L"Ethernet") == 0)   { 

        if (pCurrAddresses->PhysicalAddressLength != 0) { 
         printf("\tPhysical address: "); 
         for (i = 0; i < (int)pCurrAddresses-  >PhysicalAddressLength; 
         i++) { 
          if (i == (pCurrAddresses->PhysicalAddressLength   - 1)) { 
           printf("%.2X\n", (int)pCurrAddresses-  >PhysicalAddress[i]); 
           //str.append(pCurrAddresses-  >PhysicalAddress[i]); 
          // str += (int)pCurrAddresses-  >PhysicalAddress[i]; 
           //sprintf(Buffer + strlen(Buffer), "%.2X",   (int)pCurrAddresses->PhysicalAddress[i]); 
          } 
          else { 
           printf("%.2X-", (int)pCurrAddresses-  >PhysicalAddress[i]); 
           //str.append(pCurrAddresses-  >PhysicalAddress[i]); 
           //str += (int)pCurrAddresses-  >PhysicalAddress[i]; 
          } 
         } 
        } 
       } 

       pCurrAddresses = pCurrAddresses->Next; 

      } 
     } 
     else { 
      printf("Call to GetAdaptersAddresses failed with error: %d\n", 
       dwRetVal); 
      if (dwRetVal == ERROR_NO_DATA) 
       printf("\tNo addresses were found for the requested   parameters\n"); 
      else { 

       if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |   FORMAT_MESSAGE_IGNORE_INSERTS, 
        NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL,   SUBLANG_DEFAULT), 
        // Default language 
        (LPTSTR)& lpMsgBuf, 0, NULL)) { 
        printf("\tError: %s", lpMsgBuf); 
        LocalFree(lpMsgBuf); 
        if (pAddresses) 
         FREE(pAddresses); 
        //exit(1); 
       } 
      } 
     } 

     if (pAddresses) { 
      FREE(pAddresses); 
     } 
     MessageBoxA(NULL, str.c_str(), "testx", MB_OK); 
     system("pause"); 
     return 0; 

      } 

Ich mag die MAC-Adresse in MessageBox (winapi) unter Verwendung von Typ LPCSTR auf einmal, nicht in der Schleife drucken, wie es jetzt mit printf() geschieht. Ich muss dann die MAC-Adresse in URL senden mit InternetOpenUrl(), die den Datentyp von LPCSTR oder LPWCSTR hat, werde ich den Rest tun, sobald ich in Mac OS-Adresse in MessageBox und LPCSTR-Format jeweils zu drucken und speichern.

EDIT: Meine Frage ist: 1. Wie der Wert der Mac-Adresse in Char-Array oder String in Schleife anhängen? 2. Wie speichern Sie die MAC-Adresse in LPCSTR in MessageBox() anzuzeigen?

+0

Was ist Ihre Frage? – immibis

+0

Ein Puffer für die gesamte Zeichenfolge, "snprintf" den aktuellen Wert in einen temporären Puffer und an den Puffer in der Schleife anhängen? –

Antwort

0
char MAC[18] = {0}; 
if (pCurrAddresses->PhysicalAddressLength != 0) { 
    // a MAC is usually 6 bytes in size... 
    sprintf(MAC, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", 
     pCurrAddresses->PhysicalAddress[0], 
     pCurrAddresses->PhysicalAddress[1], 
     pCurrAddresses->PhysicalAddress[2], 
     pCurrAddresses->PhysicalAddress[3], 
     pCurrAddresses->PhysicalAddress[4], 
     pCurrAddresses->PhysicalAddress[5]); 
    printf("\tPhysical address: %s\n", MAC); 
    str.append(MAC); 
} 

Wenn Sie mit dem PhysicalAddressLength berichtet „politisch korrekt“ und formatieren Sie die tatsächliche Anzahl von Bytes sein wollen (die technisch so hoch wie 8 sein kann):

char MAC[24] = {0}; 
if (pCurrAddresses->PhysicalAddressLength != 0) { 
    char fmt[] = "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X:%.2X:%.2X"; 
    if (pCurrAddresses->PhysicalAddressLength < 8) 
     fmt[(pCurrAddresses->PhysicalAddressLength * 5)-1] = 0; 
    sprintf(MAC, fmt, 
     pCurrAddresses->PhysicalAddress[0], 
     pCurrAddresses->PhysicalAddress[1], 
     pCurrAddresses->PhysicalAddress[2], 
     pCurrAddresses->PhysicalAddress[3], 
     pCurrAddresses->PhysicalAddress[4], 
     pCurrAddresses->PhysicalAddress[5] 
     pCurrAddresses->PhysicalAddress[6], 
     pCurrAddresses->PhysicalAddress[7]); 
    printf("\tPhysical address: %s\n", MAC); 
    str.append(MAC); 
} 
+0

Ich habe 'sprintf_s' benutzt und nicht an' str' angehängt, und es hat funktioniert !!! wie erwartet. Vielen Dank, das ist eine sehr gute Webseite !!! –