本文实例讲述了php求一个网段开始与结束IP地址的方法。分享给大家供大家参考。具体如下:
比如:网段(192168.1.5/24),其子网掩码根据24划分为:
11111111.11111111.11111111.00000000(255.255.255.0)
说明:IP地址为32bits,24在划分网段中就表示前面有24个1,后面有8个0.
开始IP地址的算法是:192.168.1.5的二进制与子网掩码的二进制进行“与”运算出来的。
结束IP地址的算法是:子网掩码的二进制先取反,然后和192.168.1.5的二进制进行“或”运算
实际的就应用中,那样得出的是网络地址和广播地址,网络地址+1才是第一个主机地址,广播地址-1为最后一个主机地址。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
<?php
function mask2bin( $n )
{
$n = intval ( $n );
if ( $n <0|| $n >32)
die ( 'error submask' );
return str_repeat ( "1" , $n ). str_repeat ( "0" ,32- $n );
}
function revBin( $s )
{
$p = array ( '0' , '1' , '2' );
$r = array ( '2' , '0' , '1' );
return str_replace ( $p , $r , $s );
}
function startIp( $str , $bSub )
{
$bIp = decbin ( $str );
$bIp = str_pad ( $bIp ,8, "0" ,STR_PAD_LEFT);
$sIp = bindec ( $bIp & $bSub );
return $sIp ;
}
function endIp( $str , $bSub )
{
$bIp = decbin ( $str );
$bIp = str_pad ( $bIp ,8, "0" ,STR_PAD_LEFT);
$eIp = bindec ( $bIp | revBin( $bSub ));
return $eIp ;
}
$ip = array ( '192' , '168' , '1' , '5' ); //设定IP地址,可以从表单获取,这里只作演示
$mask = '24' ; //设置掩码
$bSub = mask2bin( $mask ); //将子网掩码转换二进制
$mask = array ();
$mask [] = substr ( $bSub , "0" ,8); //将子网掩码每8位分一段
$mask [] = substr ( $bSub , "8" ,8);
$mask [] = substr ( $bSub , "16" ,8);
$mask [] = substr ( $bSub , "24" ,8);
echo '<table summary= "result" border= "1" cellspacing= "1" cellpadding= "0" >
<tbody>
<td align= "right" ><font size= "2" >掩码:</font></td>
<td>
<font size= "2" >';
for ( $i =0; $i <4; $i ++)
{
echo bindec ( $mask [ $i ]);
if ( $i !=3)
echo "." ;
}
echo '</font>
</td>
</tr>
<tr>
<td align= "right" ><font size= "2" >网络地址:</font></td>
<td>
<font size= "2" >';
for ( $i =0; $i <4; $i ++)
{
echo startIp( $ip [ $i ], $mask [ $i ]);
if ( $i !=3)
echo "." ;
}
echo '</font>
</td>
</tr>
</td>
</tr>
<tr>
<td align= "right" ><font size= "2" >第一个可用:</font></td>
<td>
<font size= "2" >';
for ( $i =0; $i <3; $i ++)
{
echo startIp( $ip [ $i ], $mask [ $i ]);
echo "." ;
}
$ip_4 = startIp( $ip [3], $mask [3]);
echo ++ $ip_4 ;
echo '</font>
</td>
</tr>
<tr>
<td align= "right" ><font size= "2" >最后可用:</font></td>
<td>
<font size= "2" >';
for ( $i =0; $i <3; $i ++)
{
echo endIp( $ip [ $i ], $mask [ $i ]);
echo "." ;
}
$ip_4 = endIp( $ip [3], $mask [3]);
echo -- $ip_4 ;
echo '
</font>
</td>
</tr>
<tr>
<td align= "right" ><font size= "2" >广播地址:</font></td>
<td>
<font size= "2" >';
for ( $i =0; $i <4; $i ++)
{
echo endIp( $ip [ $i ], $mask [ $i ]);
if ( $i !=3)
echo "." ;
}
?>
|
希望本文所述对大家的php程序设计有所帮助。