首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IP和子网到起始IP结束IP

IP和子网到起始IP结束IP
EN

Stack Overflow用户
提问于 2010-01-08 14:51:21
回答 4查看 8.3K关注 0票数 14

因此,我有一个子网为8.8.8.0/24的IP

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

在PHP和JavaScript中

EN

回答 4

Stack Overflow用户

发布于 2010-01-08 15:26:14

我假设你还需要其他的口罩,比如8,16,...

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-01-16 20:40:43

要从斜杠表示法生成IP地址列表,请执行以下操作:

代码语言:javascript
复制
$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地址是否在某个范围内,请执行以下操作:

代码语言:javascript
复制
$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
  }
}
票数 8
EN

Stack Overflow用户

发布于 2010-01-08 15:01:36

只需将每个IP视为一个具有4位数的256进制数字。例如,

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2025971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档