2011-01-17 15 views
2

Ich möchte eine Uint32 IP-Adresse in eine verkettete Zeichenfolge konvertieren.C++ Konvertieren von Uint32 IP-Adresse in Text x.x.x.x

In diesem Prozess bekomme ich uint8 Daten, aber ich muss dies zu const char * ändern, um es mit anderen Teilen der IP verketten zu können, um die volle IP in einer Variablen zu drucken.

Wie kann ich die Uint 8 in const char * ändern? Oder gibt es einen besseren Weg für den gesamten Umwandlungsprozess?

uint32 ipAddress = GetHostIp(); 
if (ipAddress) 
{ 
    const int NBYTES = 4; 
     uint8 octet[NBYTES]; 
     int x; 
     char *ipAddressFinal; 
     for (x = 0; x < NBYTES; x++) 
     { 
      octet[x] = (ipAddress >> (x * 8)) & (uint8)-1; 
     } 
     for (x = NBYTES - 1; x >= 0; --x) 
     { 
      if (NBYTES==4) 
         { 
          const char *IPPart = octet[x]; // HERE IS THE BUG!!!!! ? 
       strcpy(ipAddressFinal, IPPart); 
         } 
      else 
         { 
          const char *IPPart = octet[x]; // HERE IS THE BUG!!!!! ? 
       strcat(ipAddressFinal, IPPart); 
         } 
      if (x > 0) 
       strcat(ipAddressFinal, "."); 
     } 
    LogAlways("IP: %s", ipAddressFinal); 
} 

bearbeiten

Danke Jungs - Problem gelöst! Dank an alle! Es ist großartig, in einer kurzen Wartezeit sehr gute Antworten zu erhalten! Vor allem dank Lacrymology !!! Hier arbeitet jetzt Code, und ich weiß nicht Linux verwende ich hätte mein OS etc aufschrieb ...

if (ipAddress) 
{ 
    const int NBYTES = 4; 
    uint8 octet[NBYTES]; 
    char ipAddressFinal[16]; 
    for(int i = 0 ; i < NBYTES ; i++) 
    { 
     octet[i] = ipAddress >> (i * 8); 
    } 
    sprintf(ipAddressFinal, "%d.%d.%d.%d", octet[3], octet[2], octet[1], octet[0]); 
    LogAlways("IP: \"%s\"", ipAddressFinal); 
} 
+1

Bitte formatieren Sie den Code - es ist nicht lesbar – ssmir

+0

Ich glaube, Sie haben ein paar Dinge über C++ Strings und Zeiger zu lernen. –

+0

FYI, Ihr Arbeitscode hatte einen Fehler darin. Ihr 'ipAddressFinal []' wurde nur 15 Bytes zugewiesen, aber mit dem Nullabschlusszeichen kann es 16 Bytes sein. Jedes Feld hat bis zu 3 Zeichen, also 3 + 1 + 3 + 1 + 3 + 1 + 3 + 1 = 16. Ich habe es so bearbeitet, dass die Leute den Fehler nicht ausschneiden und einfügen. –

Antwort

4

Bei einer Vermutung Sie verwenden Linux - gethostip() scheint in Linux Mann zu zeigen, Seiten. Wie auch immer, wenn das der Fall ist, was ist mit inet_ntoa()?

sprintf(ip_src, "%s", inet_ntoa(ipdata->ip_src)); 

Unter der Annahme, char* ip_src hat ausreichend Platz eine IP-Adresse, natürlich zu halten. Entwickelt, um struct in_addr zu char* zu konvertieren.

Fügen Sie mit: #include <arpa/inet.h>

+0

> Diese Funktionen sind veraltet, da sie nicht mit IPv6 umgehen! Benutze stattdessen inet_ntop() oder inet_pton()! Sie sind hier enthalten, weil sie immer noch in freier Wildbahn gefunden werden können. – sehe

2

Zunächst einmal die Linie, die Sie markiert mit "HIER IST DIE BUG" sollte so etwas wie sprintf ("% d", Oktett [x]) sein; aber ich werde euch geben, was ich eine bessere Lösung betrachten (in keiner Weise die besten)

uint32 ipAddress = GetHostIp(); 
if (ipAddress) 
{ 
    const int NBYTES = 4; 
    uint8 octet[NBYTES]; 
    int x; 
    char *ipAddressFinal[16]; 
    for(int i = 0 ; i < NBYTES ; i++) 
    { 
     octet[i] = ipAddress >> (i * 8); 
    } 
    sprintf("%d.%d.%d.%d", octet[0], octet[1], octet[2], octet[3]); 
} 

jetzt, das ist „falsch“, weil ich davon ausgehen, dass es 4 Bytes in einer IP-Adresse, aber es hat die Job. Auch unter der Annahme, dass, könnten Sie diese for-Schleife ändern für

if (ipAddress) 
{ 
    union { 
     uint32 raw; 
     uint8 octet[4]; 
    } ip; 
    ip.raw = ipAddress; 
    sprintf("%d.%d.%d.%d", ipAddressFinal, ip.octet[0], ip.octet[1], 
              ip.octet[2], ip.octet[3]); 
} 

Wenn Sie wollen nicht davon ausgehen, dass 4 dort würden Sie auf die erste Art und Weise zu halten haben und etwas zu tun, wie

sprintf("%s.%d", ipAddressFinal, , ipAddressFinal, ip.octet[i]); 

was ich nicht weiß, ob es funktioniert, weil die gleiche Zeichenfolge inputing und zum Ausgeben hat

+0

was @Ninefingers sagte ist noch besser XD – Lacrymology

4

Wie wäre es nur

uint32 ipAddress = GetHostIp(); 
if (ipAddress) { 
    char ipAddr[16]; 
    snprintf(ipAddr,sizeof ipAddr,"%u.%u.%u.%u" ,(ipAddress & 0xff000000) >> 24 
               ,(ipAddress & 0x00ff0000) >> 16 
               ,(ipAddress & 0x0000ff00) >> 8 
               ,(ipAddress & 0x000000ff)); 
    // depending on the byte order your GetHostIp() returns the IP address in 
    // you might need to reverse the above (i.e. print (ipAddress &0x000000ff)) first. 
    LogAlways("IP: %s", ipAddr); 
} 

Sie können auch inet_ntoa oder getnameinfo verwenden, um eine IP-Adresse in eine Zeichenfolge zu konvertieren.

+0

minus 1: dieser Code ist nicht tragbar, da ich endianess ändern musste, plus: 1 danke für den Code :) – Zac

+0

Nun, wenn es nicht tragbar ist, ist es, weil Ihre GetHostIp() nicht ist und gibt dir die IP im Little Endian Format statt im Big Endian Format :) – nos

-1

Danke Jungs - Problem gelöst! Dank an alle! Es ist großartig, in einer kurzen Wartezeit sehr gute Antworten zu erhalten! Vor allem dank Lacrymology !!! Hier funktioniert jetzt Code, und ich benutze kein Linux Ich hätte mein OS etc aufschreiben sollen ...

if (IP-Adresse) { const int NBYTES = 4; Uint8 Oktett [NBYTES]; Zeichen ipAddressFinal [15]; für (int i = 0; i < NBYTES; i ++) { Oktett [i] = ipAddress >> (i * 8); } sprintf (ipAddressFinal, "% d.% D.% D.% D", Oktett [3], Oktett [2], Oktett [1], Oktett [0]); LogAlways ("IP: \"% s \ "", ipAddressFinal); }

0

Hier ist eine aktuelle C++ Lösung

#include <arpa/inet.h> 

    std::string GetIPString(uint32_t x) const 
    { 
     char buffer[INET_ADDRSTRLEN + 1]; 
     auto result = inet_ntop(AF_INET, &x, buffer, sizeof(buffer)); 
     if (result == nullptr) throw std::runtime_error("Can't convert IP4 address"); 
     return buffer; 
    }