zoukankan      html  css  js  c++  java
  • PHP如何以Int的形式存储IP地址

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

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

    源码如下:

    <?php
    
    namespace AppUtils;
    
    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 AppUtilsIntIpUtils;
    
    $intIp = IntIpUtils::getInstance()->ipToInt("172.185.255.233");
    // dd($intIp); // 2897870825
    $ipStr = IntIpUtils::getInstance()->intToIp($intIp);
    dd($ipStr);  // 172.185.255.233
    

    测试可用

  • 相关阅读:
    Unrecognized attribute 'targetFramework'.错误解决
    [译]Razor内幕之模板
    [译]Razor内幕之解析
    Java下载中文乱码问题解决方法
    获取矩形中心点与矩形外某点连线和矩形交点的算法
    做产品开发的感想
    [译]Razor内幕之表达式
    Could not find the main class. Program will exit.
    基于SAML的单点登录.NET代理端实现方案
    Linux内核虚拟内存的管理结构说明
  • 原文地址:https://www.cnblogs.com/hxsen/p/14629436.html
Copyright © 2011-2022 走看看