OVH Cloud OVH Cloud

probleme d'adressage?

5 réponses
Avatar
alti
Bonjour!
j'ai eu un drole de comportement en utilisant, a la base, la fonction modulo;
pour des raisons du au codage en interne des adresses ip, j'ai du utiliser ma
propre fonction de convertion nnombre en adresse ip :

function number_to_ip($Adresse) {
$mod=256;
$t=$Adresse%$mod;
$t1=floor($Adresse/$mod);
$t2=floor($Adresse/pow($mod,2));
$t3=floor($Adresse/pow($mod,3));
$text=$t.'.'.$t1%$mod.'.'.$t2%$mod.'.'.$t3%$mod;
return $text;
}

la, avec un grand chiffre (4229839061 par exemple) j'avais un résultat faux, car
$t me retourne un chiffre négatif.
Bon, modulo ne doit fonctionner qu'avec des chiffres signé, donc je remplace
$t=$Adresse%$mod;
par
$t=($Adresse&255);

et la, ca fonctionne dans mes tests avec un chiffre en dur!
malheureusement, des que j'ai $adresse=fetch de mon adresse stockée en base
et ensuite echo number_to_ip($adresse), j'ai quelque chose de faux, meme chose
qu'avec le modulo!
donc quel peut etre le problème?????

je me suis arrangé en faisant mon modulo 256 dans la requete, mais c'est pas
top!
et de toute facon j'aimerai comprendre d'ou vient ce probleme!

alors quelqu'un a t il déja été confronté au probleme?


p.s. j'ai PHP Version 4.2.3 sous linux

--
--
alti
~~Il faut trouver le LA avant de retrouver le SI~~

5 réponses

Avatar
P'tit Marcel
alti écrivit:

j'ai eu un drole de comportement en utilisant, a la base, la fonction
modulo; pour des raisons du au codage en interne des adresses ip, j'ai
du utiliser ma propre fonction de convertion nnombre en adresse ip :

function number_to_ip($Adresse) {
$mod%6;
$t=$Adresse%$mod;
$t1=floor($Adresse/$mod);
$t2=floor($Adresse/pow($mod,2));
$t3=floor($Adresse/pow($mod,3));
$text=$t.'.'.$t1%$mod.'.'.$t2%$mod.'.'.$t3%$mod;
return $text;
}



Moi j'aurais fait ça par itération ou récusrivité et j'aurais évité de
mélanger une fonction concernant des entiers (modulo) avec des fonctions
impliquant des réels (pow, floor).

En gros :

function number_to_ip($Adresse) {
$reste = fmod($Adresse, 256.0);
$ret="";
if($reste < $Adresse) {
$div = ($Adresse - $reste) / 256.0;
$ret = number_to_ip ($div) . "." ;
}
return (string) $ret . sprintf("03s", $reste);
}

eça
--
P'tit Marcel
statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/

Avatar
alti
P'tit Marcel wrote:
alti écrivit:

[.......]


Moi j'aurais fait ça par itération ou récusrivité et j'aurais évité de
mélanger une fonction concernant des entiers (modulo) avec des
fonctions impliquant des réels (pow, floor).

En gros :

function number_to_ip($Adresse) {
$reste = fmod($Adresse, 256.0);
$ret="";
if($reste < $Adresse) {
$div = ($Adresse - $reste) / 256.0;
$ret = number_to_ip ($div) . "." ;
}
return (string) $ret . sprintf("03s", $reste);
}

eça


Oui, mais le probleme c'est qu'avec la version php que j'utilise, fmod n'est pas
défini!
donc obligé de me rabattre sur autre chose.

alti

Avatar
P'tit Marcel
alti écrivit:

Oui, mais le probleme c'est qu'avec la version php que j'utilise, fmod
n'est pas défini!


pas trop difficile à faire :

if(!function_exists(fmod)) {
function fmod(&$dividende, &$diviseur) {
if ($diviseur == 0) return False;
$quotient = floor((float) $dividende / (float) $diviseur);
return (float) $dividende - ($quotient * (float) $diviseur);
}
}

(pas garanti avec un/des arguments négatifs)

--
P'tit Marcel

Avatar
tyoup
Bonjour!
j'ai eu un drole de comportement en utilisant, a la base, la fonction modulo;
pour des raisons du au codage en interne des adresses ip, j'ai du utiliser ma
propre fonction de convertion nnombre en adresse ip :

function number_to_ip($Adresse) {
[...]
}

la, avec un grand chiffre (4229839061 par exemple) j'avais un résultat faux, car
$t me retourne un chiffre négatif.


oui effectivement $Adresse % 256 est négatif si $Adresse est négatif et
pas un multiple de 256. il faudrait remplacer par

$a = $Adresse % 256;
$t = ($a < 0 ? 0 : 256 ) + $a;
...

l'utilisation des opérateurs sur les bits est la bienvenue et est très
efficace (la division entière par 256 se fait avec $Adresse >> 8)

$t = $Adresse & 0xff;
$t1 = $Adresse >> 8 & 0xff;
$t2 = $Adresse >> 16 & 0xff;
$t3 = $Adresse >> 24

il existe une fonction long2ip qui fait le travail mais il me semble que
tu travailles en petit indien.

à la limite inverser l'ordre des nombres peut être plus simple
implode('.',rev(explode('.',long2ip($Adresse))));

--
Tyoup

Avatar
alti
tyoup wrote:
[....]
l'utilisation des opérateurs sur les bits est la bienvenue et est très
efficace (la division entière par 256 se fait avec $Adresse >> 8)

$t = $Adresse & 0xff;
$t1 = $Adresse >> 8 & 0xff;
$t2 = $Adresse >> 16 & 0xff;
$t3 = $Adresse >> 24


Effectivement, je savais qu'il y avait une mèthode avec les opérateurs sur les
bits, malheureusement, ca fais partie des connaissances qui me manquent ( et
y'en a beaucoup)

il existe une fonction long2ip qui fait le travail mais il me semble
que tu travailles en petit indien.

à la limite inverser l'ordre des nombres peut être plus simple
implode('.',rev(explode('.',long2ip($Adresse))));




Pour long2ip, je sais tres bien qu'elle existe, mais ca ne correspondait pas au
codage des applis interne, de l'adresse ip.
(je ne vois pas ce que tu veux dire par petit indien)
Mais je n'avais pas fait l'essai avec le
implode('.',array_reverse(explode('.',long2ip($Adresse))));
ce qui apparement fonctionne.
En tout cas je vous remercie (tyoup et P'tit Marcel) d'avoir eclairé ma
lanterne!

alti