本文实例讲述了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程序设计有所帮助。