IP и подсеть для запуска IP-адреса

Итак, у меня есть IP-адрес с подсети: 8.8.8.0/24

Как я могу преобразовать это в 8.8.8.0 и 8.8.8.255 (на самом деле их результат ip2long)

В PHP и JavaScript

Ответы

Ответ 1

Предполагаю, что вам понадобится и другая маска, такая как 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 будет 0x080808FF, что составляет 8.8.8.255

  • ip_num & (0xffffffff ^ mask) будет 0x08080800, что составляет 8.8.8.0

  • вам нужно преобразовать ip_num обратно в ip string back

Ответ 2

Чтобы создать список 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
  }
}

Ответ 3

Просто обрабатывайте каждый 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

Ответ 4

Я думаю, что это может быть чем-то вроде того, к чему вы клоните. Он определит все 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);
}