• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • long2ip()

    (PHP 4, PHP 5, PHP 7)

    将长整型转化为字符串形式带点的互联网标准格式地址(IPV4)

    说明

    long2ip(int $proper_address): string

    long2ip()函数通过长整型的表达形式转化生成带点格式的互联网地址(例如:aaa.bbb.ccc.ddd )。

    参数

    $proper_address

    合格的地址,长整型的表达形式。

    返回值

    返回字符串的互联网 IP 地址。

    更新日志

    版本说明
    7.1.0参数$proper_address的类型从string改成integer。

    注释

    Note:

    在 32 位架构中,从string转换integer整型形式的 ip 地址将有可能导致错误的结果,因为结果数字超出了PHP_INT_MAX限制。

    参见

    • ip2long() 将 IPV4 的字符串互联网协议转换成长整型数字
    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;
        }
      }
    ?>
    
    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));
      }
    ?>
    
    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
    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);
    }
    ?>
    
    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);
     }
    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
    ?>
    
    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.

    上篇:ip2long()

    下篇:openlog()