[英]IP and Subnet to Start IP End IP
所以我有一個IP子網,如:8.8.8.0/24
如何將其轉換為8.8.8.0和8.8.8.255(實際上是他們的ip2long結果)
在PHP和JavaScript中
我會假設您還需要其他面具,如8,16,......
ip="8.8.8.0/24"
提取每個部分ip_array=ip.match(/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)\\/(\\d+)/)
// js regex
轉換為數字ip_num = (ip[1]<<24)+(ip[2]<<16)+(ip[3]<<8)+(+ip[4])
//#0x08080800
mask=(1<<(32-ip[5]))-1
//#0xFF
ip_num | mask
ip_num | mask
為0x080808FF,即8.8.8.255
ip_num & (0xffffffff ^ mask)
將為0x08080800,即8.8.8.0
你需要將ip_num
轉換回ip string
要從斜杠表示法生成IP地址列表:
$range = "8.8.8.0/24";
$addresses = array();
@list($ip, $len) = explode('/', $range);
if (($min = ip2long($ip)) !== false) {
$max = ($min | (1<<(32-$len))-1);
for ($i = $min; $i < $max; $i++)
$addresses[] = long2ip($i);
}
var_dump($addresses);
要檢查IP地址是否在一個范圍內:
$checkip = "8.8.8.154";
$range = "8.8.8.0/24";
@list($ip, $len) = explode('/', $range);
if (($min = ip2long($ip)) !== false && !is_null($len)) {
$clong = ip2long($checkip);
$max = ($min | (1<<(32-$len))-1);
if ($clong > $min && $clong < $max) {
// ip is in range
} else {
// ip is out of range
}
}
只需將每個IP視為基數為256的4位數字。 例如,
8.8.8.0 == 8 * 256^3 + 8 * 256^2 + 8 * 256^1 + 0 * 256^0 == 134744064
8.8.8.1 == 8 * 256^3 + 8 * 256^2 + 8 * 256^1 + 1 * 256^0 == 134744065
8.8.8.1 == 8 * 256^3 + 8 * 256^2 + 8 * 256^1 + 2 * 256^0 == 134744066
...
8.8.8.255 == 8 * 256^3 + 8 * 256^2 + 8 * 256^1 + 255 * 256^0 == 134744319
我想這可能是你所得到的。 它將確定給定范圍內的所有IP。
$ip = '8.8.8.0';
$mask = 24;
$ip_enc = ip2long($ip);
# convert last (32-$mask) bits to zeroes
$curr_ip = $ip_enc | pow(2, (32-$mask)) - pow(2, (32-$mask));
$ips = array();
for ($pos = 0; $pos < pow(2, (32-$mask)); ++$pos) {
$ips []= long2ip($curr_ip + $pos);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.