最近在公司做一些解析ip的需求,把ip转成整型当作redis的key值是一个不错的选择。下面说一下ip地址怎么转整型的。
php语法
echo ip2long("220.181.1.2"); // 输出结果:-592117502
以上出现了负数,原因是ip地址较大,这里可以将其转成无符号格式。
echo sprintf("%u",ip2long($ipAdd)); //输出结果:3702849794 用sprintf %u 转化成无符号
ip2long是php自带的函数,她的转化原理很简单:
ip大家都知道是四段,每段范围是0-255,也就是四个0-255的数字用"."拼接起来的。
ip2long就是把每一段都写成二进制然后拼起来,注意这里转成二进制是要转成8位,不足8位补齐8位。例如:1就是00000001,5就是00000101,最大的255就是11111111,8位。再然后将拼起来的二进制转成十进制。
$ipAdd = "220.181.1.2";
$ipArr = explode(".",$ipAdd);
$ipStr = "";
for($i=0;$i<4;$i++){
echo sprintf("%08d", decbin($ipArr[$i]))."<br/>"; //这里循环输出:11011100 10110101 00000001 00000010 不足8位的用0补齐8位
$ipStr .=sprintf("%08d", decbin($ipArr[$i]));
}
echo $ipStr."<br/>";//这里是拼接起来的结果:11011100101101010000000100000010
echo bindec($ipStr);//这里是二进制转成十进制的结果:3702849794