PHP如何以Int的形式存储IP地址

以下是我的编写的IP转int的单例模式。

要求:PHP版本^7.1可以直接使用
低版本的应用,删除参数类型和返回值类型,也可以直接使用。

源码如下:

<?php

namespace App\Utils;

class IntIpUtils
{
    private static $instance;

    private function __construct()
    {
    }

    /**
     * @return IntIpUtils 返回当前的实例
     */
    public static function getInstance(): IntIpUtils
    {
        if(!self::$instance){
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * @param string $ip 传入字符串ip信息
     * @return int 返回转换成功的Int形式的ip信息
     */
    public function ipToInt(string $ip): int
    {
        $ipArr = explode('.', $ip);
        $resInt = 0;
        // 172.185.255.233
        foreach ($ipArr as $item) {
            // 基础数据做移动8位
            $resInt = $resInt << 8;
            // 与当前数据进行按位或运算,目的是把后面的数字转换成二进制后,依次拼在后面
            $resInt |= $item;
        }
        // 最后以int的形式输出当前二进制数字
        return $resInt;
    }

    /**
     * @param int $int 传入Int形式的ip
     * @return string 返回目标ip
     */
    public function intToIp(int $int): string
    {
        $ipStr = '';
        for ($i = 3; $i >= 0; $i--) {
            // 算数运算符的优先级高于位运算符
            // 数字进行移位之后,再与二进制11111111数据,进行按位与运算,依次取出当前的IP字符串
            $ipStr .= ($int >> $i * 8 & 0b11111111) . '.';
        }
        return rtrim($ipStr, '.');
    }

}

测试代码如下:

use App\Utils\IntIpUtils;

$intIp = IntIpUtils::getInstance()->ipToInt("172.185.255.233");
// dd($intIp); // 2897870825
$ipStr = IntIpUtils::getInstance()->intToIp($intIp);
dd($ipStr);  // 172.185.255.233

测试可用

posted @ 2021-04-07 20:32  houxin  阅读(121)  评论(0编辑  收藏  举报