Funktion für Umwandlung von IP



  • Hi,

    Ich will gerade eine Funktion schreiben, die mir eine "DottedIP" aus dem Format "123.123.123.123" in eine IP als einen unsigned long-Wert ausgibt, wie sie auch im Netzwerk benutzt wird. Bisher muss man für jede Stelle 3 Zeichen benutzen und Fehlerabfragen sind auch noch keine drinne, aber es geht nicht. Das hier ist mein Code:

    long iptolong(char *ipstring)
    {
         char tmpstring[2];
         unsigned long iplong;
         char i=0;
         if (strlen(ipstring)!=15)
            return -1;
         for (i=0;i<4;i++)
         {
             tmpstring[0]=ipstring[0+(i*4)];
             tmpstring[1]=ipstring[1+(i*4)];
             tmpstring[2]=ipstring[2+(i*4)];
             iplong = iplong + ((256*(i-3))* ((tmpstring[2]-48)+((tmpstring[1]-48)*10)+((tmpstring[0]-48)*100)));
         }
         return iplong;
    }
    

    Ich hole zuerst 3 Bytes Platz für die je 3 Zeichen pro Stelle. Dann mache ich eine Schleife für die 4 Stellen. In jeder überschreibe ich die Zeichen in das temporäre Array und addiere sie dann zu dem schon gespeicherten unter Einbezug der Stelle und so weiter.

    Nur gehts nicht! 😞 Währe froh mir könnte jemand helfen. Gibt es eine solche Funktion in der Standartlib? Ich futschle gerade mit SDL_net rum, vielleicht gibt es ja da sowas, ich habe sowas noch nicht entdeckt.

    Vielen Dank,

    joachim_neu



  • Ups... Hatte einen mathematischen Fehler, sorry. Jetzt geht es:

    long iptolong(char *ipstring)
    {
         char tmpstring[2];
         unsigned long iplong;
         char i=0;
         if (strlen(ipstring)!=15)
            return -1;
         for (i=0;i<4;i++)
         {
             tmpstring[0]=ipstring[0+(i*4)];
             tmpstring[1]=ipstring[1+(i*4)];
             tmpstring[2]=ipstring[2+(i*4)];
             iplong = iplong * 256;
             iplong = iplong + ((tmpstring[2]-48)+((tmpstring[1]-48)*10)+((tmpstring[0]-48)*100));
         }
         return iplong;
    }
    

    joachim_neu





  • die stärke der scanf()-funtionen ist, daß sie ein, wenn auch primitives, parsing des eingabe-strings erlauben.

    int
    iptolong (char *ipstring, unsigned long *iplongp)
    {
      unsigned ip[3];
      unsigned long iplong;
      int i;
    
      i=sscanf(ipstring,"%u.%u.%u.%u",&ip[0],&ip[1],&ip[2],&ip[3]);
    
      /* fehler, wenn nicht alle vier werte gelesen werden konnten */
      /* oder werte nicht im gültigen bereich liegen */
      if(i!=4 || ip[0]>255 || ip[1]>255 || ip[2]>255 || ip[3]>255)
        return 0;
    
      for(i=0,iplong=0; i<4, i++)
        iplong=(iplong<<8)+ip[i];
    
      *iplongp=iplong;
      return 1;
    }
    

    deine methode, einen fehler mit iplong==-1 zu melden, ist unsauber! -1 entspräche der ip-addresse 255.255.255.255. deshalb gibt die funktion das ergebnis an einen zeiger. im fehlerfall ist der rückgabewert gleich 0.

    EDIT:
    deine funtion geht nicht, weil:

    char tmpstring[2];
    

    müßte

    char tmpstring[3];
    

    lauten.

    und du hast vergessen, die variable iplong mit 0 zu initialisieren (falls dein compiler das nicht schon automatisch macht).


Anmelden zum Antworten