Actuellement, j'ai deux façons de calculer les entiers longs IPv4:

//IPv4 format: w.x.y.z
$ip_number = (16777216 * $w) + (65536 * $x) + (256 * $y) + $z;
$ip_number = ip2long($ip);

Mais comment calculer IPv6 en un entier long?

Je recherche une fonction ou quelque chose qui ne m'oblige pas à installer des extensions en PHP.

Modifier:

J'ai besoin de l'entier long pour pouvoir le comparer pour une requête de plage IP. Voici un exemple de ligne pour une requête de plage IPv6:

"58569075684585412230123897272863293440","58569076873007849944088961176022548479","MU","Mauritius"
1
Amy Neville 28 déc. 2015 à 22:35

2 réponses

Meilleure réponse

Suggestions:

Stocker longtemps n'est pas une bonne façon pour cela. Utilisation,

string inet_ntop ( string $in_addr )

Cette fonction convertit une adresse IPv4 32 bits ou IPv6 128 bits (si PHP a été construit avec le support IPv6 activé) en une représentation sous forme de chaîne appropriée pour la famille d'adresses.

Vous devriez aussi voir,

string inet_pton ( string $address )

Exemple inet_ntop ()

<?php
$packed = chr(127) . chr(0) . chr(0) . chr(1);
$expanded = inet_ntop($packed);

/* Outputs: 127.0.0.1 */
echo $expanded;

$packed = str_repeat(chr(0), 15) . chr(1);
$expanded = inet_ntop($packed);

/* Outputs: ::1 */
echo $expanded;
?>

Comparaison dans la gamme

Les deux fonctions suivantes ont été introduites dans PHP 5.1.0, inet_pton et inet_pton. Leur objectif est de convertir les adresses IP lisibles par l'homme en leur représentation in_addr compressée. Puisque le résultat n'est pas purement binaire, nous devons utiliser la fonction unpack pour appliquer des opérateurs au niveau du bit.

Les deux fonctions prennent en charge IPv6 et IPv4. La seule différence est la façon dont vous décompressez l'adresse des résultats. Avec IPv6, vous déballerez avec le contenu avec A16, et avec IPv4, vous déballerez avec A4.

Pour mettre le précédent en perspective, voici un petit exemple de sortie pour aider à clarifier:

// Our Example IP's
$ip4= "10.22.99.129";
$ip6= "fe80:1:2:3:a:bad:1dea:dad";


// ip2long examples
var_dump( ip2long($ip4) ); // int(169239425)
var_dump( ip2long($ip6) ); // bool(false)


// inet_pton examples
var_dump( inet_pton( $ip4 ) ); // string(4)
var_dump( inet_pton( $ip6 ) ); // string(16)

Nous démontrons ci-dessus que la famille inet_ * prend en charge IPv6 et v4. Notre prochaine étape sera de traduire le résultat compressé en une variable décompressée.

// Unpacking and Packing
$_u4 = current( unpack( "A4", inet_pton( $ip4 ) ) );
var_dump( inet_ntop( pack( "A4", $_u4 ) ) ); // string(12) "10.22.99.129"


$_u6 = current( unpack( "A16", inet_pton( $ip6 ) ) );
var_dump( inet_ntop( pack( "A16", $_u6 ) ) ); //string(25) "fe80:1:2:3:a:bad:1dea:dad"

Remarque: la fonction actuelle renvoie le premier index d'un tableau. Cela équivaut à dire $ array [0].

Après le déballage et l'emballage, nous pouvons voir que nous avons obtenu le même résultat que l'entrée. Il s'agit d'une simple preuve de concept pour nous assurer que nous ne perdons aucune donnée.

Enfin utiliser,

if ($ip <= $high_ip && $low_ip <= $ip) {
  echo "in range";
}

Référence: php.net

2
Sazzad Hissain Khan 28 déc. 2015 à 20:17

Ok, voici comment je l'ai finalement résolu:

function ipaddress_to_ipnumber($ipaddress) {
    $pton = @inet_pton($ipaddress);
    if (!$pton) { return false; }
    $number = '';
    foreach (unpack('C*', $pton) as $byte) {
        $number .= str_pad(decbin($byte), 8, '0', STR_PAD_LEFT);
    }
    return base_convert(ltrim($number, '0'), 2, 10);
}

https://inkplant.com/code/ipv6-to-number

0
Amy Neville 28 déc. 2015 à 20:27