Codage et décodage d'adresse ip [code en c]

Description

Ce code permet de coder (on ne peut pas parler de cryptage) une adresse IP "classique" (de forme 127.127.127.127, vers sa forme entière en int sur 32 bits, c'est à dire 2139062143 ici) et bien entendu de faire le contraire.
(les 2 types d'adresse sont acceptées par les navigateurs, les clients FTP, etc...)

Mon premier but était d'expliquer la procédure de décodage que l'on m'a demandée plusieurs fois (et aussi de montrer à certains sceptiques l'utilité des opérateurs binaires :-) )

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
  //va contenir la saisie
  char IP[24];

  //compteur de points dans l'adresse
  int point=0;

  //va contenir les 4 parties de l'adresse en numérique
  unsigned int aiIP[4];

  //va contenir l'IP alternative qui est sous forme d'int32
  unsigned int IPAlt;

  puts("Entrez une adresse IP\n");
  gets(IP);

  int j=0;
  do {
    if(IP[j] == '.')
      point++;
    else if(IP[j]<48 || IP[j]>57) {
      puts("Entree incorrecte !");
      getchar();
      return -1;
    }
  } while(IP[++j]);

  if(point==3) {

    sscanf(IP, "%u.%u.%u.%u", aiIP, aiIP+1, aiIP+2, aiIP+3);
      
    if(aiIP[0] > 255 || aiIP[1] > 255 || aiIP[2] > 255 || aiIP[3] > 255) {
      //nombre supérieur à 255 : erreur de saisie
      puts("Entree incorrecte !");
      getchar();
      return -1;
    }

    //Codage de l'adresse
    IPAlt = (aiIP[0]<<24) | (aiIP[1]<<16) | (aiIP[2]<<8) | aiIP[3];

    printf("IP alternative : %u\nAppuyez sur ENTREE pour continuer . . .", IPAlt);
  }
  else if(!point) {

    IPAlt = (unsigned int)atoi(IP);

    for(unsigned int i=0; i<4; i++)
      aiIP[i] = (IPAlt & (0xFF000000 >> (i<<3))) >> ((3^i)<<3);

/* on prend les 8 bits de poids le plus fort, on les décale à droite
et on les sauve puis on prend les 8 suivants, on les décale à droite
et on les sauve, et ainsi de suite.... */

    printf("Adresse IP : %u.%u.%u.%u\nAppuyez sur ENTREE pour continuer . . .", aiIP[0], aiIP[1], aiIP[2], aiIP[3]);
  }
  else {
    puts("Entree incorrecte !");
    getchar();
    return -1;
  }

  getchar();
  return 0;
}

Conclusion :


(compilé avec LCC-Win32 : http://www.cs.virginia.edu/~lcc-win32/ )

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.