2010-01-08 35 views
13

Así que tengo una IP con una subred como: 8.8.8.0/24IP y subred de IP inicial IP final

¿Cómo puedo convertir esto en 8.8.8.0 y 8.8.8.255 (en realidad sus resultantes ip2long)

En PHP y JavaScript

+0

Creo que te refieres 8.8.8.0/24 para una máscara de subred 255.255.255.0. – amphetamachine

+0

Solo para aclarar; ¿Desea determinar la Id. de subred y la dirección de difusión para una dirección IP y una máscara de subred determinadas? –

+1

Solo quiero las ips de inicio y fin del rango especificado por la subred – steven

Respuesta

0

Simplemente trate cada IP como un número base 256 con 4 dígitos. Por ejemplo,

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

Creo que esto puede ser algo así como lo que estás consiguiendo. Determinará todas las direcciones IP en un rango determinado.

$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

Voy a suponer que usted también necesitará de otra máscara como 8,16, ...

ip="8.8.8.0/24" 
  1. extracto de cada parte ip_array=ip.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)/) // JS expresiones regulares

  2. convertido al número 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 habrá 0x080808FF cuales es 8.8.8.255

  5. ip_num & (0xffffffff^mask) habrá 0x08080800, que es 8.8.8.0

  6. es necesario convertir de nuevo a ip_num cadena de IP de nuevo

8

Para generar una lista de direcciones IP a partir de la notación de barra:

$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); 

Para comprobar si una dirección IP está dentro del rango:

$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 
    } 
}