ip 掩码换算 192.168.1.53/18

根据192.168.1.53/18,计算出子网掩码,最大主机(iP)数,可用主机数,子网段,网络号,广播号:

可以看出,192.168.1.53掩了18位,换算成二进制掩码就是18个1和14个0,因为32位二进制是4位的八进制,比如32个1表示255.255.255.255,比如32个0表示0.0.0.0,那么18位掩码的二进制就是1111 1111.1111 1111.1100 0000.0000 000,换算成八进制是255.255.192.0,所以掩码是255.255.192.0

可用主机数需要拿掩码来换算,可用的B类主机共有(256-192=64)*256=16384个,去除1个网络号,再去除1个广播号,那么可用的主机数是16384-2=16382个。问题来了网络号是啥,广播号是啥?答:网络号是最小主机号,广播号是最大主机号。问题又来了,最小主机号是多少最大主机号是多少?要解决最小最大问题我们还需要知道掩出的子网范围,子网范围的换算方法是:

=256/(256-192)

=256/64

=4个子网段

4个了网段范围分别是0~63, 64~127, 128~191, 192~255

由192.168.1.53的第三位iP地址可以看出1属于0~63的子网段,那么由此可推断出iP地址的范围是192.168.0.0到192.168.63.255,即然知道ip范围,那最小的iP是192.168.0.0,最大iP是192.168.63.255,即网络号是192.168.0.0广播号是192.168.63.255

希望对你有用。

public static function isIPsegment($ip){
   return strpos($ip, '/') === false ? false : true;
}
public static function IPSegmentConvert($ip){
   $is_ip_segment = self::isIPsegment($ip);
   if($is_ip_segment === false){
       return false;
   }
   list($ip_addr, $segment) = explode('/', $ip);
   if(!in_array(intval($segment), self::IP_SEGMENT)){
       return false;
   }
   // 计算掩码
   $mask = '';
   $mask = str_pad($mask, $segment, '1');
   $mask = str_pad($mask,32, '0');
   $mask = str_split($mask, 8);
   // 子网范围
   $ip_arr = explode('.', $ip_addr);
   if ($segment >= 24) {
       $net_f = 256 - bindec($mask[3]);
       $ip_s = $ip_arr[3];
       $location = 3;
   } else if ($segment >= 16) {
       $net_f = 256 - bindec($mask[2]);
       $ip_s = $ip_arr[2];
       $location = 2;
   } else if ($segment >= 8) {
       $net_f = 256 - bindec($mask[1]);
       $ip_s = $ip_arr[1];
       $location = 1;
   } else {
       $net_f = 256 - bindec($mask[0]);
       $ip_s = $ip_arr[0];
       $location = 0;
   }
   $net_s = 256/$net_f;
   $start_number = $end_number = 0;
   for($i=0; $i<$net_s; $i++) {
       if ($ip_s >= ($i*$net_f) && $ip_s < (($i+1)*$net_f)) {
           $start_number = $i*$net_f;
           $end_number = ($i+1)*$net_f-1;
           break;
       }
       continue;
   }
   if ($location == 3) {
       $ip_start = $ip_arr[0].'.'.$ip_arr[1].'.'.$ip_arr[2].'.'.$start_number;
       $ip_end = $ip_arr[0].'.'.$ip_arr[1].'.'.$ip_arr[2].'.'.$end_number;
   } else if ($location == 2) {
       $ip_start = $ip_arr[0].'.'.$ip_arr[1].'.'.$start_number.'.0';
       $ip_end = $ip_arr[0].'.'.$ip_arr[1].'.'.$end_number.'.255';
   } else if ($location == 1) {
       $ip_start = $ip_arr[0].'.'.$start_number.'.0.0';
       $ip_end = $ip_arr[0].'.'.$end_number.'.255.255';
   } else {
       $ip_start = $start_number.'.0.0.0';
       $ip_end = $end_number.'.255.255.255';
   }
   return [
       "ip_addr"=>$ip_addr.'/'.$segment,
       "start_ip"=>IP::iptolong(explode('.', $ip_start)),
       "end_ip"=>IP::iptolong(explode('.', $ip_end))
   ];
}

public static function iptolong($ip_arr){
   return (($ip_arr[0] * 256 + $ip_arr[1]) * 256 + $ip_arr[2]) * 256 + $ip_arr[3];
}


(完)