PHP IP转为整形函数分解
获取ip地址与ip地址字符串转为10位数整形,原生php代替函数ip2long()和long2ip
/**
- @param $ip
- @return int
- 代替php原函数ip2long()
- 十进制最大值是255,超过是不合法的ip,直接返回
- 每个ip段的值最大为255,十六进制为FF,故最长是两位,
- 例IP = 1.1.1.1 如果不补0,则十六进制为 1111,十进制为 4369
- 补0为 十六进制为 01010101,十进制为 16843009
- 如果十六进制长度小于2,则自动补0
- hexdec($newHex) 十六进制转为十进制,dechex($value);将十进制ip段转为十六进制
*/
function ipToInt($ip) {
$newHex = '';
$aIp = explode('.', $ip);
foreach ($aIp as $key => $value) {
if($value > 255) return '';
$hex = dechex($value);
if(strlen($hex) < 2) $hex = '0'.$hex;
$newHex .= $hex;
}
$int = hexdec($newHex);//十六进制转为十进制
return $int;
}
/**
- @param $int
- @return string
- 代替php原函数long2ip()
- FFFFFF最大为4294967295
- 十六进制默认会忽略最左边的0,毕竟是0了,怎么算都是0,留着也没用
- 但中间的0会保留,而IP的十六进制最大为FFFFFF(大F团)
- 所有为防止7位IP的出现,我们只能手动补0,才能成双成对(2个一对)
- 截取十六进制的第一位,如果第一位为0,说明原始数值只有1位,还是要拆散
- dechex($int);十进制转为十六进制 , hexdec($hex);将每段十六进制数转换我为十进制,即每个ip段的值
*/
function intToIp($int) {
$aIp = array();
$int = $int > 4294967295 ? 4294967295 : $int;
$dec = dechex($int);
if(strlen($dec) < 8) $dec = '0'.$dec;
for($i = 0; $i < 8; $i += 2){
$hex = substr($dec, $i, 2);
$ippart = substr($hex, 0, 1);
if($ippart === '0') $hex = substr($hex, 1, 1);
$aIp[] = hexdec($hex);
}
return implode('.',$aIp);
}
空空如也