文档章节

IP转换整形(ip2long)

net ljx
 net ljx
发布于 2011/04/27 11:03
字数 611
阅读 256
收藏 1
如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如 
<?php 
echo ip2long("10.2.1.3"); 
?> 
我们将得到 
167903491 

这是如何计算的,目前我知道有两个算法。其一 
<?php 
function ip2int($ip){ 
   //我们先把ip分为四段,$ip1,$ip2,$ip3,$ip4 
   list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip); 
   //然后第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256 
   //这即是我们得到的值 
   return $ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4; 

?> 

其二,用位运算 
<?php 
function ip2int($ip){ 
   list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip); 
   return ($ip1<<24)|($ip2<<16)|($ip3<<8)|($ip4); 

?> 

我们会发现,有些ip转化成整数后,是负的,这是因为得到的结果是有符号整型,最大值是2147483647.要把它转化为无符号的,可以用 
sprintf("%u",ip2long($ip); 

就能转换为正整数。而且得到的结果用long2ip也可以正常转换回原来的ip地址。也可以用ip2long来验证一个ip是否是有效的,如 
<?php 
function chk_ip($ip){ 
   if(ip2long($ip)=="-1") { 
      return false; 
   } 
   return true; 

//应用 
var_export(chk_ip("10.111.149.42")); 
var_export(chk_ip("10.111.256.42")); 
?> 
将输出true和false 

转自http://blog.csdn.net/wztgq/archive/2005/06/28/406662.aspx


把ip数据保存在数据库(MySQL)中时候,我们习惯用ip2long函数生成整型,然后存放在一个int(11)类型的字段中,但是,在不同的系统平台上,ip2long函数得到的值是不同的,因此可能造成在从数据库中读出数据,用long2ip得到ip的时候产生错误,说一下我们碰到的情况:
我们用一个int(11)类型(范围-2147483648 - 2147483647)来保存把一个ip地址用ip2long处理得到的结果,例如ip是’202.105.77.179′,那么在32位机器上得到的结果是:-899068493,而在64位机器上却得到3395898803.然后把它写入数据库,由于超过int(11)的范围,因此64位机器上的结果被保存为int(11)的最大值:2147483647.于是在从数据库中取出的时候,便得到了错误的结果,会得到”127.255.255.255″这个ip地址.
解决的办法很多,比如可以用mysql的函数:INET_ATON和INET_NTOA来处理ip地址;或者把保存ip地址的字段改为bigint类型,这样在64位机器上虽然保存的是3395898803,使用long2ip函数仍能得到正确的结果.

本文转载自:http://www.blogjava.net/imfisher/archive/2007/08/24/139152.html

下一篇: reg_match
net ljx
粉丝 9
博文 44
码字总数 8319
作品 0
广州
私信 提问
PHP对IP地址和子网掩码的处理方法

ip2long IP地址转换成整型。 long2ip 整型数据转换成IP。 子网掩码转换成掩码长度方式: $slashnotation = strlen(pregreplace("/0/", "", decbin(ip2long($subnet_mask)))); $bits=strpos(d......

艹PHP
2014/10/31
842
0
PHP中IP地址与整型数字互相转换详解

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

mac_zhao
2014/11/08
143
0
PHP实现IP–数字互相转换

PHP实现IP–数字互相转换 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org......

蜗牛奔跑
2015/09/09
173
0
MySQL优化20条经验(二)

11.尽可能使用NOT NULL 除非必要,否则尽可能保持字段NIOT NULL; NULL需要额外的空间,并且在比较的时候程序会更复杂。 12.使用Prepared Statements Prepared Statements很想存储过程,是一个...

笨小熊
2016/11/02
45
0
PHP: 详解ip2long和long2ip

在开发中,经常需要将IP地址转成整型进行保存,这样不仅有利于做索引,并且原本需要15个字节的存储空间,转换后只需4个字节就能存储了。但是很多人对于ip2long的结果有时候是负数并不理解,本...

陈亦
2014/02/09
20.2K
5

没有更多内容

加载失败,请刷新页面

加载更多

Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
40分钟前
3
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
59分钟前
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
6
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0
jenkins 插件下载加速最终方案

推荐做法 1、告诉jenkins 我哪些插件需要更新 jenkins插件清华大学镜像地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 1.进入jenkins系统管理 2.进入插件管...

vasks
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部