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/1999/xhtml">
- <head>
- <title>第一php网提供的教程--PHP实现IP--数字互相转换</title>
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
- </head>
- <body>
- <?php
- /*
- * 作者:XXXX
- */
- //将IP转换为数字
- function ipton($ip)
- {
- $ip_arr = explode('.', $ip);//分隔ip段
- $ipstr = "";
- foreach ($ip_arr as $value)
- {
- $iphex=dechex($value);//将每段ip转换成16进制
- if(strlen($iphex)<2)//255的16进制表示是ff,所以每段ip的16进制长度不会超过2
- {
- $iphex='0'.$iphex;//如果转换后的16进制数长度小于2,在其前面加一个0
- //没有长度为2,且第一位是0的16进制表示,这是为了在将数字转换成ip时,好处理
- }
- $ipstr.=$iphex;//将四段IP的16进制数连接起来,得到一个16进制字符串,长度为8
- }
- return hexdec($ipstr);//将16进制字符串转换成10进制,得到ip的数字表示
- }
- //将数字转换为IP,进行上面函数的逆向过程
- function ntoip($n)
- {
- $iphex=dechex($n);//将10进制数字转换成16进制
- $len=strlen($iphex);//得到16进制字符串的长度
- if(strlen($iphex)<8)
- {
- $iphex='0'.$iphex;//如果长度小于8,在最前面加0
- $len=strlen($iphex); //重新得到16进制字符串的长度
- }
- //这是因为ipton函数得到的16进制字符串,如果第一位为0,在转换成数字后,是不会显示的
- //所以,如果长度小于8,肯定要把第一位的0加上去
- //为什么一定是第一位的0呢,因为在ipton函数中,后面各段加的'0'都在中间,转换成数字后,不会消失
- for($i=0,$j=0;$j<$len;$i=$i+1,$j=$j+2)
- {//循环截取16进制字符串,每次截取2个长度
- $ippart=substr($iphex,$j,2);//得到每段IP所对应的16进制数
- $fipart=substr($ippart,0,1);//截取16进制数的第一位
- if($fipart=='0')
- {//如果第一位为0,说明原数只有1位
- $ippart=substr($ippart,1,1);//将0截取掉
- }
- $ip[]=hexdec($ippart);//将每段16进制数转换成对应的10进制数,即IP各段的值
- }
- //$ip = array_reverse($ip);
- return implode('.', $ip);//连接各段,返回原IP值
- }
- $ip = '202.105.77.179';
- echo $ip . '<br>';
- $num = ipton($ip);
- echo $num . '<br>';
- echo ntoip($num).'<hr/>';
- $sys_ip = '202.105.77.179';
- echo 'srcoundIP:' . $sys_ip . '<br>';
- $sys_int = ip2long($sys_ip);
- echo 'iptonum:' . $sys_int . '<br/>';
- echo 'numtoip:'.long2ip($sys_int) . "<hr>";
- ?>
- </body>
- </html>
- 说明:
- mysql自带了inet_aton函数来实现将ip地址转换为数字,inet_ntoa函数将数字转换为ip。SELECT INET_ATON( '10.122.22.1' )
- 上面的转换函数为站长原创,碰巧实现了跟mysql系统函数相同的转换效果,呵呵,兴奋好久~~原来PHP提供了ip2long和long2ip2个函数来实现IP与数字的转换,站长做了无用功了,不过权当锻炼逻辑思维吧~~这是两种实现方法,一种是在程序上实现;一种是直接在sql语句中实现,很方便,不错,保存下来了,发到自己的博客,以后就不会忘记了。把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函数仍能得到正确的结果.
这是某位大师写的,很不错,有点小错误我给改了,现在正常了
PHP IP互换数字[转]的更多相关文章
- 在 shell 脚本获取 ip、数字转换等网络操作
在 shell 脚本获取 ip.数字转换等网络操作 ip 和数字的相互转换 ip转换为数字 :: function ip2num() { local ip=$1 local a=$(echo $ip ...
- 【转】 ip段/数字,如192.168.0.1/24是什么意思?
http://blog.csdn.net/aerchi/article/details/39396423 ip段/数字,如192.168.0.1/24是什么意思? ip段/数字,如192.168.0. ...
- [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?
IP地址.子网掩码.网络号.主机号.网络地址.主机地址以及ip段/数字-如192.168.0.1/24是什么意思? 2016年03月26日 23:38:50 JeanCheng 阅读数:105674 ...
- ip段/数字,如192.168.0.1/24的意思是什么?(转)
ip段/数字,如192.168.0.1/24的意思是什么? 踩踩 0作者:Admin 发表日期:2013-10-31 复制链接 收藏 首先来了解一下二进制的转换知识: 二进制数转换成十进制数 二进制的 ...
- 大小写互换-"数字字符串"转换成数字
今天穿着hacker浑浊马甲在百度编程课堂实训习题中发现了这个很简单的问题,就做了下. 为了考虑输入的是否是数字,结果写好后竟然超时了. 不过里面用到的将字符串装换成数字的方法,感觉是个收获,因此在此 ...
- ip、数字的互转
# ip ==> 数字 >>> ip2num = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[: ...
- Python ip与数字的转换方式
例子:IP:192.168.1.10 方法一: In [1]: bin(192)Out[1]: '0b11000000' In [2]: bin(168)Out[2]: '0b10101000' In ...
- 第十九篇:Mysql两次Group by和ip转数字作比较的一次优化
业务场景:两张表,ipconfig_group表存了单位和 ip 起始段信息 visit_info表存储了访问次数,失败次数,访问流量,用户ip等信息 两张表的关系为: 一个部门下有若干ip段, ...
- 【python】点分十进制ip与数字互转
来源:http://www.cnblogs.com/vovlie/archive/2012/10/17/2727029.html 利用lambda表达式,非常简洁 int_to_ip = lambda ...
随机推荐
- Apache Commons 工具类
http://blog.csdn.net/feicongcong/article/details/53374399http://blog.csdn.net/hsienhua/article/detai ...
- [转]mysql 5.6 存储过程+事务+游标+错误异常抛出+日志写入
转自:http://www.wolonge.com/post/detail/118249 DELIMITER $$ USE `ecstore`$$ DROP PROCEDURE IF EXISTS ` ...
- sublimeText3安装package control和禁止弹出更新下载弹窗
1.sublimeText3安装package control import urllib.request,os; pf = 'Package Control.sublime-package'; ip ...
- 搭建PHP开发环境 apache+MySQL+PHP 安装phpMyAdmin模块
该博文参考的资料来源于: http://wenku.baidu.com/view/0e4c569ddd3383c4bb4cd267.html http://www.cnblogs.com/pharen ...
- C++访问sqlite3实践
Sqlite确实是一个比较好的本地数据库,从接触它的时候就喜欢上了它,它可以在很多情况下简化应用.不过以前都是在Java里面使用,或者Linux C下使用的,现在有个项目(C++)可能我会用到sqli ...
- java数组的拷贝四种方法:for、clone、System.arraycopy、arrays.copyof
public class ArrayCopy{ public static void main(String []args){ int []a = {1,3,4,5}; toPrint(a); int ...
- JMeter使用记录1 -- JDBC測试
场景:使用jmeter对web应用和mysql数据库进行压力測试 JMeter是一款很强大的測试工具.能够用来測试web,数据库.从07年用过之后一直对它情有独钟,以下记录下在一个项目中对它的简单使用 ...
- 【转】char码值对应列表大全
char("56") A char("97") a [转]char码值对应列表大全 Char("0") 为0的字符Char("1& ...
- ASP.NET MVC 自我总结的便捷开发实例
前言 工作了这么久了,接触ASP.NET MVC已经很久了,一直都想总结一下它的一些实用的,经常使用的一些技巧,但是因为一直都很懒,也不想总结,所以一直都没有好好写出来,趁着现在有这种冲劲,那么就先把 ...
- 模版引擎(NVelocity)开发
在net中用模版开发,在handler中用到了大量的html代码.为解决这个问题,我可以采用模版引擎(NVelocity)进行开发.1.首先需要将NVelocity.dll文件放入项目,其次引用.2. ...