String-Ip in Char-IP umwandlen



  • char ist sowieso ein ungeeigneter Datentyp.
    Char geht von -128 bis 127



  • BigNeal schrieb:

    char ist sowieso ein ungeeigneter Datentyp.
    Char geht von -128 bis 127

    meinte natürlich unsigned char

    Benutze die API Funkion inet_addr(..).
    komm mit dieser Funktion noch nicht klar; die liefert mir doch nur einen unsigned long wert von der kompletten IP, oder?

    unsigned long ulAddr = inet_addr((const char *)lpData);
    


  • BigNeal schrieb:

    char ist sowieso ein ungeeigneter Datentyp.
    Char geht von -128 bis 127

    Nö. Ob char vorzeichenbehaftet ist, ist implementationsabhängig.



  • BigNeal schrieb:

    char ist sowieso ein ungeeigneter Datentyp.
    Char geht von -128 bis 127

    Das ist implementierungsabhängig. Du kannst Dich also nicht darauf verlassen, dass das überall so ist. char hat entweder denselben Wertebereich wie signed char oder den von unsigned char. Der von signed char enthält garantiert -127...127 und der Wertebereich von unsigned char umfasst mindestens die Ganzzahlen 0,1,2,...255.

    Trotzdem hast Du recht, dass unsigned char[4] wahrscheinlich angebrachter wäre.



  • unsigned long ulAddr = inet_addr((const char *)lpData);
    

    gibt es eine ander möglichkeit, welche mir gleich ein unsigned char array als ip ausgibt??? und keine ganze ulong ?



  • Hau nen reinterpret_cast drauf und gut ist.



  • #include <array>
    #include <string>
    
    #include <winsock2.h>
    
    #pragma comment (lib, "ws2_32.lib")
    
    std::tr1::array<unsigned char, 4> to_bytes(const std::string& ip)
    {
        unsigned long addr = inet_addr(ip.c_str());
    
        std::tr1::array<unsigned char, 4> buf;
        buf[0] = static_cast<unsigned char>((addr & 0x000000FF) >> 0);
        buf[1] = static_cast<unsigned char>((addr & 0x0000FF00) >> 8);
        buf[2] = static_cast<unsigned char>((addr & 0x00FF0000) >> 16);
        buf[3] = static_cast<unsigned char>((addr & 0xFF000000) >> 24);
        return buf;
    }
    
    int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
    {
        std::tr1::array<unsigned char, 4> bytes = to_bytes("192.168.1.32");
        bytes;
    }
    


  • Michael E. schrieb:

    Hau nen reinterpret_cast drauf und gut ist.

    unsigned char ip[4]; 
    ip[0] = reinterpret_cast<unsigned char>inet_addr((const char *)lpData);
    

    so ungefähr?



  • unsigned long ulAddr = inet_addr((const char *)lpData);
    unsigned char* ip = reinterpret_cast<unsigned char*>(&ulAddr);
    


  • Michael E. schrieb:

    Hau nen reinterpret_cast drauf und gut ist.

    Kann funktionieren, muss aber nicht - sizeof(unsigned long) muss nicht 4 sein, außerdem gibts da noch die endianess... Portabel ist das also auf keinen Fall.



  • pumuckl schrieb:

    Michael E. schrieb:

    Hau nen reinterpret_cast drauf und gut ist.

    Kann funktionieren, muss aber nicht - sizeof(unsigned long) muss nicht 4 sein, außerdem gibts da noch die endianess... Portabel ist das also auf keinen Fall.

    Das hab ich mir auch zuerst überlegt. Aber dann bin ich zum Schluss gekommen, dass ich nicht portableren Code schreiben muss als inet_addr mir liefert 🕶

    Übrigens wirds in der Dokue (http://msdn.microsoft.com/en-us/library/ms738563(VS.85).aspx) analog mit C-Casts gemacht.


Anmelden zum Antworten