2010-01-08 35 views
13

所以我有像子網的IP:8.8.8.0/24IP和Subnet開始IP結束IP

我怎樣才能將它轉換爲8.8.8.0和8.8.8.255(實際上他們ip2long生成物)

在PHP和JavaScript中

+0

我想你的意思8.8.8.0/24爲255.255.255.0的子網掩碼。 – amphetamachine 2010-01-08 06:59:09

+0

只是爲了澄清;您是否想要確定給定IP地址和子網掩碼的子網ID和廣播地址? – 2010-01-08 07:10:34

+1

我只想要子網指定範圍的開始和結束ips – steven 2010-01-08 07:38:11

回答

0

只要對待每個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 
-1

我想這可能就是你所得到的。它將確定給定範圍內的所有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); 
} 
8

我會假設你還需要其他面具像8,16,...

ip="8.8.8.0/24" 
  1. 提取每個部分ip_array=ip.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)/) // JS正則表達式

  2. 轉換到號碼ip_num = (ip[1]<<24)+(ip[2]<<16)+(ip[3]<<8)+(+ip[4]) //#0x08080800

  3. mask=(1<<(32-ip[5]))-1 //#0xFF的

  4. ip_num | mask將0x080808FF是8.8.8.255

  5. ip_num & (0xffffffff^mask)將是0x08080800這是8.8.8.0

  6. 需要ip_num轉換回IP字符串返回

8

要生成斜線表示法的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 
    } 
}