<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<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段
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值
}
echo
ipton(
'119.255.31.226'
);
echo
'<br>'
;
$num
=
'379374783'
;
echo
strlen
(
$num
).
'<br/>'
;
echo
ntoip(
$num
).
'<br/>'
;
echo
'trueipnum:'
.
ip2long
(
'119.255.31.226'
).
'<br/>'
;
echo
'trueip:'
.long2ip(
'3793747831'
);
?>
</body>
</html>
mysql自带了inet_aton函数来实现将ip地址转换为数字,inet_ntoa函数将数字转换为ip。 SELECT INET_ATON( '10.122.22.1' ) 上面的转换函数为站长原创,碰巧实现了跟mysql系统函数相同的转换效果,呵呵,兴奋好久~~ 原来PHP提供了ip2long和long2ip2个函数来实现IP与数字的转换,站长做了无用功了,不过权当锻炼逻辑思维吧~~ 这是两种实现方法,一种是在程序上实现;一种是直接在sql语句中实现,很方便,不错,保存下来了,发到自己的博客,以后就不会忘记了。 |