IP地址和子网如何转换为起始IP和结束IP

15

我有一个IP地址和子网掩码,如下: 8.8.8.0/24

如何将其转换为8.8.8.0和8.8.8.255(实际上是它们的ip2long结果)

在PHP和JavaScript中实现


我认为你的意思是使用子网掩码255.255.255.0来表示8.8.8.0/24。 - amphetamachine
只是想澄清一下:您是否想要确定给定IP地址和子网掩码的子网ID和广播地址? - Tom Duckering
1
我只需要子网指定的范围的起始IP和结束IP。 - steven
4个回答

8
我假设你也需要其他掩码,比如8、16等等。
ip="8.8.8.0/24"
  1. 提取每个部分:ip_array=ip.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)/) // JavaScript 正则表达式

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

0

将每个IP地址视为一个由4位组成的256进制数。例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接