[PHP] fonction ip2bin

Salut a tous :hello:
Je dois manipuler en php des ip en binaire
ex: 192.168.191.0 donne 11000000.10101000.10111111.00000000,
je lis c’est ip dans un fichier (cf: mon topic extraction tag=valeur :paf:)
je souhaite ensuite faire quelques opérations sur ces ip en binaire, comme par exemple verifier que ip*netmask=network pour verifier que l’ip apartient bien a ce sous-reseau.
j’aimerais aussi calculer le broadcast a partir du network et netmask.
j’ai donc fait ces fonctions:


# convertit un ipV4 ou V6 en binaire
function ip2bin($ip){

   $octets=explode(".",$ip);

   for($i=0;$i<sizeof($octets);$i++){
      $octets[$i]=str_pad(decbin((int)$octets[$i]),8,"0",STR_PAD_LEFT);
      $retour.=$octets[$i];
   }

   return $retour;
}

# comparaison ET bit a bit de 2 strings
function cmpETstr($str1,$str2){

   for($i=0;$i<strlen($str1);$i++)
      if($str1{$i}=="1" && $str2{$i}=="1")
         $retour.="1";
      else
         $retour.="0";

   return $retour;
}

# retourne 1 si adress correspond au couple network netmask 0 sinon
function isInSubNet($adress,$network,$netmask){

   if( (!strcmp(cmpETstr(ip2bin($adress),ip2bin($netmask)),ip2bin($network))) )
      return 1;
   else
      return 0;
}

Ca marche mais en partant d’une string j’ai du manipuler characteres par characteres.
Y’a t’il une facon plus directe de faire cela en manipulant l’ip bit-a-bit avec l’operateur & (l’ip comme un entier de 4octets soit 32bits) et donc sans faire une fonction cmpETstr ?
cf: fromscratch.dyndns.org/analyse_hosts/verif_adr_netwm2.php

Cordialement

Et pourquoi ne pas utiliser ce qui existe déjà :

http://fr.php.net/ip2long

?

ip2long donne dans lexemple:
http://www.example.com/[/url], [url=http://192.0.34.166/]http://192.0.34.166/, et http://-1073732954/
mais comment ensuite retrouvé depuis -1073732954 la valeur en binaire et faire les calcul bit a bit ?

Ben je sais pas ce que tu veux faire, mais si tu veux vérifier que l’ip est entre 192.168.0.0 et 192.168.0.255 suffit de faire une comparaison :

$ip = ip2long($truc);
if ( $ip between ip2long('192.168.0.0') and ip2long('192.168.0.255') )
  ...;

merci :jap: ca va me servir de toute maniere :wink:
Le truc c’est que partant du netmask et du network je calcul via l’ip en binaire le reste des info a la maniere d’ipcalc sous Unix.
EDIt: et ta raison, ca marche :smiley: meme pour le calcul bit a bit