php手动实现ip2long和long2ip
/** * 测试 */ public function testipAction() { $ip = '10.58.101.175'; echo ip2long($ip); echo "<br>"; echo $this->myip2long($ip); echo "<br>"; echo long2ip('171599279'); echo "<br>"; echo $this->mylong2ip('171599279'); } /** * 自己实现ip2long * @param $ip * @return float|int|string */ protected function myip2long($ip) { $newhex = ''; // 将ip分割成数组 $ipsArr = explode('.', $ip); foreach ($ipsArr as $key => $value) { // 十进制最大值是255,如果超过,则直接返回 if ($value > 255) { return ''; } // 将十进制转化为十六进制 $hex = dechex($value); // 每个ip最大是255,十六进制是FF,最大是两位 // 比如ip:1.1.1.1如果不补0,则十六进制是1111,十进制是4369 // 如果补0,则十六进制是01010101,十进制是16843009 if (strlen($hex) < 2) { // 如果十六进制长度小于2,则自动补0 $hex = '0' . $hex; } $newhex .= $hex; } // 十六进制转化为十进制 $intStr = hexdec($newhex); return $intStr; } /** * 自己实现long2ip * @param $int * @return string */ protected function mylong2ip($int) { // FFFFFF最大为4294967295 $int = $int > 4294967295 ? 4294967295 : $int; // 将十进制转为十六进制 $hex = dechex($int); //为了避免7位ip出现,我们手动补0 if (strlen($hex) < 8) { // 长度小于8,则自动补0 $hex = '0'. $hex; } // 每两位进行分组。然后查看每组的第一位是否是0,如果是则去掉。然后把得到的值转为十进制,放在数组中,最后把数组用.连接起来 for ($i =0; $i<8;$i+=2) { $a = substr($hex, $i, 2); $ippart = substr($a, 0, 1); if ($ippart === '0') { $a = substr($a, 1, 1); } $aparr[] = hexdec($a); } return implode('.', $aparr); }