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
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
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
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);
}
Voy a suponer que usted también necesitará de otra máscara como 8,16, ...
ip="8.8.8.0/24"
extracto de cada parte ip_array=ip.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)/)
// JS expresiones regulares
convertido al número ip_num = (ip[1]<<24)+(ip[2]<<16)+(ip[3]<<8)+(+ip[4])
// # 0x08080800
mask=(1<<(32-ip[5]))-1
// # 0xFF
ip_num | mask
habrá 0x080808FF cuales es 8.8.8.255
ip_num & (0xffffffff^mask)
habrá 0x08080800, que es 8.8.8.0
es necesario convertir de nuevo a ip_num
cadena de IP de nuevo
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
}
}
Creo que te refieres 8.8.8.0/24 para una máscara de subred 255.255.255.0. – amphetamachine
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? –
Solo quiero las ips de inicio y fin del rango especificado por la subred – steven