Conversion C/C++ => Php

Résolu
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015 - 21 mai 2007 à 11:18
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015 - 22 mai 2007 à 18:07
Bonjour bonjour...

Je cherche quelqu'un connaissant assez le C/C++, mes connaissances en la matière étant plutot basiques, qui pourrait me convertir ce petit code parce que j'ai du mal à comprendre deux trois truc notament au niveau des pointers... .. .

static int _validate_ipv4(char *str, int str_len, int *ip)
{
    const char *end = str + str_len;
    int num, m;
    int n = 0;

    while (str < end) {
        if (*str < '0' || *str > '9') {
            return 0;
        }
        m = 1;
        num = ((*(str++)) - '0');
        while (str < end && (*str >= '0' && *str <= '9')) {
            num = num * 10 + ((*(str++)) - '0');
            if (num > 255 || ++m > 3) {
                return 0;
            }
        }
        ip[n++] = num;
        if (n == 4) {
            return str == end;
        } else if (str >= end || *(str++) != '.') {
            return 0;
        }
    }
    return 0;       
}

Voili voilou... merci d'avance à celui qui s'y collera... .. .

@ tchaOo°

l'homme est un loup pour l'homme... .. .

11 réponses

J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
21 mai 2007 à 12:34
Ca va, merci...

En fait, le plus de cette fonction par rapport à un simple découpage est qu'elle vérifie aussi que les nombre ne dépasse pas 255 :

// si num plus gros que 255 ou fait plus de trois caractères... erreur
if (num > 255 || ++m > 3) {
    return 0;
}
3
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
21 mai 2007 à 12:10
Salut kankrelune...

Parfois, il ne faut pas cherche à traduire "mot-à-mot"...

<?php
header('Content-type:text/plain');

function int_validate_ipv4 ( $str ) {
    $d = '(\d{1,3})';
    $reg_ip = "!^$d\.$d\.$d\.$d$!";

    $ip = array();

    if ( !preg_match($reg_ip, $str, $numbers) ) return false;
    array_shift($numbers);
    
    foreach ( $numbers as $num ) {
        if ( $num < 0 or $num > 255 ) return false;
        $ip[] = $num;
    }
    return $ip;
}

$ips = array();
$ips[] = '123.34.0.32';
$ips[] = '123.346.0.32';
$ips[] = '127.0.0.1';
$ips[] = '123.34.0.32.6';
$ips[] = '123.34.0.a';
$ips[] = '123.34..32';
foreach ( $ips as $str ) {
    if ( $ip = int_validate_ipv4($str) ) echo "$str OK ",implode('.',$ip),"\n";
    else echo "$str NO\n";
}
?>

Sinon, dans ta fonction C++:
str est un nombre (adresse mémoire)
*str est l'objet à cette adresse (donc ici, un charactère)
str_len est le nombre de charactères d'une chaine commençant à str


idem avec ip... c'est une adresse mémoire et *ip est ce qu'il y a à cette adresse... ip étant un pointeur vers un tableau d'entier, ce qui y a à *ip est un entier. D'où le ip[n++] qui veut dire "ce qui est pointer par ip plus un décalage de n" soit "le nième élément du tableau"... PHP à repris cette écriture (à PERL, qui l'a pompé à C, qui la pompé à Fortran... enfin bref c'est un classique).

A+
0
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
21 mai 2007 à 12:24
Salut J_G content de te voir dans le coin... ça fait un bail j'espere que tout va bien pour toi... .. .

Effectivement je me doute que, bien que php et C(++) sont assez proche au niveau syntaxique, la conversion mot à mot n'est pas forcement toujours la meilleur chose et d'ailleurs n'est pas toujours possible... .. .

La plus grande interrogation pour moi était ce qui resort dans ce tableau d'entiers "ip" en fait c'est juste les parties de l'ip... soit...

$ip = array_map('intval',explode('.', $str));

non ?

la validation d'ip via une regexp je connait, pas de problème, mais l'utilité de cette fonction et plus particulièrement du tableau ip c'est de pouvoir valider des plages d'ou l'interet que je lui porte... .. .

Je te remercie J_G

@ tchaOo°

l'homme est un loup pour l'homme... .. .
0
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
21 mai 2007 à 12:36
Oki... mais à ce moment là on peut faire la vérif via la regexp... .. .

Merci J_G

@ tchaOo°

l'homme est un loup pour l'homme... .. .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
21 mai 2007 à 16:15
Salut,

j'aime pas trop ton code en C... il devrait deja stoquer ca sur des char et pas des int... ensuite, il utilise un argument, par adresse pour renvoyer les 4 chiffres d'une ip, mais le truc, c'est que le retour n'est pas utilise pour renvoyer une eventuelle erreur de parsing, donc c'est pas top... autant faire une struct qui contiendrait 4 chars et renvoyer directement cette struct...

Bref, le return 0 a chaque fois c'est debile... Sinon, renvoyer un int et utiliser des decalages de bits pour recuperer les 4 octets, c'est aussi une bonne idee selon moi.

en php tu peux appeller ip2long, et faire $a=$ip%256; $b = ((int)( $ip / 256 )) % 256; ...

In a dream, I saw me, drop dead... U were there, U cried... It was just a dream, if I die, U won't cry, maybe, U'll be happy
Mon si
0
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
22 mai 2007 à 15:48
"j'aime pas trop ton code en C"

Ouep... mais en même temps c'est pas mon code... il provient du code source de php... .. . ;o)

"en php tu peux appeller ip2long, et faire $a=$ip%256; $b = ((int)( $ip / 256 )) % 256;"

Tu pourrais develloper parce que je comprend pas vraiment là... .. .

@ tchaOo°

l'homme est un loup pour l'homme... .. .
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
22 mai 2007 à 16:30
la ca te decoupe ton ip de sa forme XXX.XXX.XXX.XXX en la forme array(XXX, XXX, XXX, XXX)

donc t'as sinon explode et une conversion en int
0
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
22 mai 2007 à 17:41
Ouep... genre...

$ip = array_map('intval',explode('.', $str));

C'est ce que je fais... .. .

Sinon histoire de vous embeter si vous avez le courage de regarder la fonction suivante je serais curieux d'avoir votre avis quand à son, possible, équivalant en php... ça m'interesse...

static int _validate_ipv6(char *str, int str_len TSRMLS_DC) /* {{{ */
{
    int compressed = 0;
    int blocks = 8;
    int n;
    char *ipv4;
    char *end;
    int ip4elm[4];

    if (!memchr(str, ':', str_len)) {
        return 0;
    }

    /* check for bundled IPv4 */
    ipv4 = memchr(str, '.', str_len);
    if (ipv4) {
         while (ipv4 > str && *(ipv4-1) != ':') {
            ipv4--;
        }

        if (!_validate_ipv4(ipv4, (str_len - (ipv4 - str)), ip4elm)) {
            return 0;
        }
        str_len = (ipv4 - str) - 1;
        if (str_len == 1) {
            return *str == ':';
        }
        blocks = 6;
    }

    end = str + str_len;
    while (str < end) {
        if (*str == ':') {
            if (--blocks == 0) {
                return 0;
            }           
            if (++str >= end) {
                return 0;
            }
            if (*str == ':') {
                if (compressed || --blocks == 0) {
                    return 0;
                }           
                if (++str == end) {
                    return 1;
                }
                compressed = 1;
            }               
        }
        n = 0;
        while ((str < end) &&
               ((*str >= '0' && *str <= '9') ||
                (*str >= 'a' && *str <= 'f') ||
                (*str >= 'A' && *str <= 'F'))) {
            n++;
            str++;
        }
        if (n < 1 || n > 4) {
            return 0;
        }
    }
    return (compressed || blocks == 1);
}

Enfin... si ça vous fait chier vous le dites... .. . ;o)

@ tchaOo°

l'homme est un loup pour l'homme... .. .
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
22 mai 2007 à 17:48
Ouai, effectivement, il y a plus simple (cf la page d'ip2long) :
Example 1549. IP validation

<?php
// make sure IPs are valid. also converts a non-complete IP into

// a proper dotted quad as explained below.
$ip = long2ip(ip2long("127.0.0.1")); // "127.0.0.1"
$ip = long2ip(ip2long("10.0.0")); // "10.0.0.0"
$ip = long2ip(ip2long("10.0.256")); // "10.0.1.0"
?>
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
22 mai 2007 à 18:00
Ben... Faut voir ;)

samb057 at gmail dot com
26-Dec-2006 09:37

Convert an ipv6 address to an base 10 integer


function ip2long6($ip)

    {

        if (substr_count($ip, '::'))

            {

                $ip = str_replace('::', str_repeat(':0000', 8 - substr_count($ip, ':')) . ':', $ip) ;

            }

            

        $ip = explode(':', $ip) ;

        

        $r_ip = '' ;

        foreach ($ip as $v)

            {

                $r_ip .= str_pad(base_convert($v, 16, 2), 16, 0, STR_PAD_LEFT) ;

            }

            

        return base_convert($r_ip, 2, 10) ;

    }
0
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
22 mai 2007 à 18:07
Oui je connais le...

$ip = long2ip(ip2long("127.0.0.1"));

mais le truc c'est que ce n'était pas la validation de l'ip qui m'interessait... ça je sais faire via un regexp... ce qui m'interessait c'était de savoir ce qui était stocké dans le tableau d'entier "ip"... car son contenu sert à valider des plages privés ou réservés... voila le pourquoi du comment de ma question... .. . ;o)

Sinon pour la 
ip2long6() je vais me pencher dessus mais faut que je trouve 
long2ip6()... .. . ;o)

@ tchaOo°


l'homme est un loup pour l'homme... .. .
0
Rejoignez-nous