PHP 8.1.0 RC 2 available for testing

long2ip

(PHP 4, PHP 5, PHP 7, PHP 8)

long2ipConvertit une adresse entier long (IPv4) en sa notation décimale à point

Description

long2ip(int $ip): string|false

La fonction long2ip() génère une adresse Internet en notation décimale à point (format aaa.bbb.ccc.ddd) à partir de sa représentation entier long.

Liste de paramètres

ip

Une propre représentation d'une adresse sous forme entier long

Valeurs de retour

Retourne l'adresse IP Internet, sous la forme d'une chaîne de caractères, ou false si une erreur survient.

Historique

Version Description
7.1.0 La type du paramètre ip a été modifié de string en int.

Notes

Note:

Sur les architectures 32-bits, transtyper la représention d'adresses IP de string à int ne donnera pas de résultats correct pour les nombres qui dépassent PHP_INT_MAX.

Voir aussi

  • ip2long() - Convertit une chaîne contenant une adresse (IPv4) en notation décimale à point en une adresse entier long

add a note add a note

User Contributed Notes 8 notes

up
10
Gabriel Malca
15 years ago
If the function doesn't exist:

<?
    if (!function_exists("long2ip")) {
        function long2ip($long) {
            // Valid range: 0.0.0.0 -> 255.255.255.255
            if ($long < 0 || $long > 4294967295) return false;
            $ip = "";
            for ($i=3;$i>=0;$i--) {
                $ip .= (int)($long / pow(256,$i));
                $long -= (int)($long / pow(256,$i))*pow(256,$i);
                if ($i>0) $ip .= ".";
            }
            return $ip;
        }
    }
?>
up
1
steve at computurn dot com
2 years ago
For a 32bit safe long2ip, which can accept string or signed integer input, try:

  function safelong2ip($long) {
    $binStr = sprintf("%032s", decbin((float)$long));
    if (strlen($binStr) != 32) {
      throw new Exception("Invalid IPv4 subnet!");
    }

    $ipArr = [];
    for ($i = 0; $i < 4; ++$i) {
      $ipArr[] = bindec(substr($binStr, $i*8, 8));
    }

    return implode('.', $ipArr);
  }
up
0
Rolf
5 months ago
an Anonymous wrote several years ago that you should cast the parameter to float to make sure that you get the right result on 32-bit machines. That probably never worked.

But the idea is on a good track: to convert a bitstring into an ip, use

$ip = long2ip((int)bindec($bits));

This works on 32- and 64-bit machines.
up
0
klawd at kamundo dot de
9 years ago
Use these two functions to convert from and to numbers compatible to MySQLs INET_ATON and INET_NTOA
<?php
   
function convertIpToString($ip)
    {
       
$long = 4294967295 - ($ip - 1);
        return
long2ip(-$long);
    }
    function
convertIpToLong($ip)
    {
        return
sprintf("%u", ip2long($ip));
    }
?>
up
0
Anonymous
10 years ago
If you're running a 32 bit machine you can get wrong IPs. To prevent from this just cast to float e.g.

<?php
long2Ip32bit
($ip){
   return
long2ip((float)$ip);
}
?>
up
0
Tom Crosley
18 years ago
I wanted to be able to pass an IP address in a URL always as an unsigned int.  I then converted it back as shown below:

$ip_addr = "192.168.100.25";  // example IP address that converts to neg #

$s32int = ip2long($ip_addr);

$us32str = sprintf("%u",$s32int);               // convert to unsigned string

// display orig IP address, signed 32 bit version, unsigned 32 bit ver,
// finally converted back to IP addr

printf("%s ,%d, %s, %s", $ip_addr, $s32int, $us32str,
         long2ip(-(4294967296-$us32str)));

// tested on Linux/Apache PHP 4.1.2
up
-6
flobee
16 years ago
when importing ip-ranges to a mysql database using an INT(10) field - NOTE: that you will get problems when using intval() function!

copied from "cleong" : 02-Oct-2001 02:21
intval() handles overflow differently depending on the type of the argument.
<?php
// intval('10000000000') = 2147483647
// intval(1e10) = 1410065408
?>
up
-12
php dot net at davidstockton dot com
13 years ago
Beware when processing values that are invalid, you may get values that are different based on the OS.  For instance:

$ip = long2ip(pow(2,32)+1024);

On windows you get 255.255.255.255.  On linux it's 0.0.4.0.

So it seems it would be important to make sure the long you're converting is in the correct range.
To Top