IP转换成整型存储是数据库优化一大趋势,不少人目前存储IP时还在使用字符串类型存储,字符串索引比整型索引消耗资源很多,特别是表中数据量大的时候,以及求查询某一个ip段的数据,今天说的ip是指ip4,ip6不在本文范围内。

系统函数ip2long与long2ipPHP中有内置函数ip2long可以将ip地址转换整型。

$ip = '210.110.11.49';

echo ip2long($ip);

输出:

-764540111

输出的整型有负号是因为我们得到的结果是有符号整型,有符号整型最大值2147483647,要把结果转换为无符号型可以这么写:

3530427185

使用long2ip把整型转换回ip地址

$ip = '210.110.11.49';

$ip_int = ip2long($ip);

echo $ip."
";

echo $ip_int."
";

echo long2ip($ip_int);

输出:

210.110.11.49

-764540111

210.110.11.49

从结果可以看到,ip与整型可以通过函数完成。

系统函数小bug

这中bug网上一搜都是,大意说的是ip某段加个前导0,先来看看这个bug实例

$ip = '210.110.011.49';

$ip_int = ip2long($ip);

echo $ip."
";

echo $ip_int."
";

echo long2ip($ip_int);

输出:

210.110.011.49

-764540623

210.110.9.49

转换结果不匹配,我们试着在ip第一段数字前加前导0,再看看

$ip = '021.110.11.49';

$ip_int = ip2long($ip);

echo $ip."
";

echo $ip_int."
";

echo long2ip($ip_int);

输出:

021.110.11.49

292424497

17.110.11.49

转换结果都出错。以上例子都是因为加了前导0后导致转换结果出错,连带逆转结果与原转换ip不匹配。

转换原理

目前有两个算法:

第一、第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256、最后总和

$ip = '0210.110.11.49';

function ipToInt($ip){

$iparr = explode('.',$ip);

$num = 0;

for($i=0;$i

$num += intval($iparr[$i]) * pow(256,count($iparr)-($i+1));

}

return $num;

}

echo  $ip.'
';

$ip_int = ipToInt($ip);

echo $ip_int.'
';

echo long2ip($ip_int);

输出:

0210.110.11.49

3530427185

210.110.11.49

第二、通过位运算符

$ip = '0210.110.11.49';

function ipToInt($ip){

$iparr = explode('.',$ip);

return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3]));

}

echo  $ip.'
';

$ip_int = ipToInt($ip);

echo $ip_int.'
';

echo long2ip($ip_int);

输出:

0210.110.11.49

-764540111

210.110.11.49

检测IP是否合法

第一、自己遍历检测

function check_ip($ip){

$iparr = explode('.',$ip);

foreach($iparr as $v){ if($v>255) return false; }

return true;

}

echo '210.285.11.49,';

var_dump(check_ip('210.285.11.49'));

echo '
';

echo '210.205.11.49,';

var_dump(check_ip('210.205.11.49'));

[code]

输出:

[code]

210.285.11.49,bool(false)

210.205.11.49,bool(true)

第二、使用ip2long返回

function check_ip($ip){

if(ip2long($ip)) return true;

return false;

}

echo '210.285.11.49,';

var_dump(check_ip('210.285.11.49'));

echo '
';

echo '210.205.11.49,';

var_dump(check_ip('210.205.11.49'));

输出:

210.285.11.49,bool(false)

210.205.11.49,bool(true)

后记

不少人把ip写库用ip2long转换存放int类型的字段中,但是,在不同的系统平台上,ip2long函数得到的值是不同的,因此可能造成在从数据库中读出数据逆转ip时用long2ip得到的ip与原ip不符合

如果是mysql可以使用mysql系统函数INET_ATON与INET_NTOA解决,或者使用bigint类型处理,要么自己写函数。

ip地址转换数字函数 iton_PHP中IP地址与整型数字互相转换详解相关推荐

  1. PHP中IP地址与整型数字互相转换详解

    这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...

  2. ip地址转换数字函数 iton_DataLakeAnalytics: 解析IP地址对应的国家城市的函数

    Data Lake Analytics 作为云上数据处理的枢纽,最近加入了通过IP地址查找对应的国家.省份.城市.ISP的函数, 今天带大家体验一下. 函数详细介绍 本次一共添加了下面这些函数: ip ...

  3. ip地址转换数字函数 iton_字符串IP地址转换成IP数值函数

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_IP2Int]') and xtype in (N'FN ...

  4. ip地址转换数字函数 iton_IP地址的字符串形式和数字形式之间的相互转换函数

    最近要用到网络编程的东西,差一点自己去山寨已有的函数.基础不好,不知道已有函数可以满足需要,呵呵. 这个示例程序说的是ip地址的数字形式和字符串形式之间的相互转换. 从字符串形式转换到数字形式: in ...

  5. EXCEL 中自定义函数的应用(关于 XOR 在 EXCEL 中的用法 及 文本型数字求和)

    EXCEL 中,能否同调用内置函数一样在工作表中调用自已制作的自定义函数,出现对话框.同时也能做到像内置函数对话框里的说明?答案是肯定的,下面举例说明: 题目: ①对文本型一系列数字进行求和(SUM( ...

  6. Python之pandas:pandas中to_csv()、read_csv()函数的index、index_col(不将索引列写入)参数详解之详细攻略

    Python之pandas:pandas中to_csv().read_csv()函数的index.index_col(不将索引列写入)参数详解之详细攻略 目录 pandas中to_csv().read ...

  7. html内置时间对象,JavaScript中的常用事件,以及内置对象详解

    原标题:JavaScript中的常用事件,以及内置对象详解 今天是刘小爱自学Java的第81天. 感谢你的观看,谢谢你. 话不多说,开始今天的学习: 学前端有一个非常权威的组织,也就是w3c,其有个专 ...

  8. php sprintf 后面补0,PHP数字前补0的自带函数sprintf 和number_format的用法(详解)

    下面小编就为大家带来一篇PHP数字前补0的自带函数sprintf 和number_format的用法(详解).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 很多时候我们 ...

  9. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

最新文章

  1. 回顾2013 - 技术上
  2. CTFshow 反序列化 web273
  3. 数字时代企业内部如何高效协作?这款工具值得一试
  4. pdf安装包_有么有pdf控件,不需要用户安装任何安装包直接打印的?
  5. 拒绝双写:巧用Lindorm数据订阅
  6. 使用动态代理解决网站字符集编码问题:(之前通过拦截器)
  7. javascript-网页换肤案例
  8. ssis for循环容器_SSIS包中的序列容器
  9. 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护 2
  10. Linux学习笔记二十——系统裁剪之二
  11. android tv webview,Android TV开发---WebView焦点处理
  12. IT程序猿应该投资些什么
  13. WPF 使用值转换器进行绑定数据的转换IValueConverter
  14. 软件测试第三次作业-worldCount
  15. Visio绘图怎么对齐连接点
  16. Ubuntu 18.04 安装NVIDIA显卡驱动教程
  17. 记一次联想Y7000P安装黑apple系统地经历
  18. 服务器的安全措施有哪些呢?
  19. 上顿号符号_顿号在键盘上怎么打?每日一答
  20. 【回归预测-PNN分类】基于粒子群算法群优化概率神经网络算法实现空气质量评价预测附matlab代码

热门文章

  1. addEventListener和attachEvent的区别
  2. 达梦数据库索引的创建与测试
  3. 修复office 2007或2010安装程序找不到Proplas.ww/Proplsww.cab
  4. vue+jsplumb 实现根据数据渲染出连线绘图
  5. c语言细胞自动机,细胞自动机之兰顿蚂蚁
  6. The Matrix(黑客帝国)
  7. 手机二要素认证接口怎么用?手机号姓名验证怎么操作?
  8. Excel - 学习 - 笔记6: Excel 函数 - filter 函数
  9. 内网后渗透,生成免杀后门!!
  10. [附源码]Python计算机毕业设计Django自行车租赁管理系统