首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据起始IP和网络掩码长度计算范围内的结束IP

如何根据起始IP和网络掩码长度计算范围内的结束IP
EN

Stack Overflow用户
提问于 2014-05-29 21:11:38
回答 2查看 2.5K关注 0票数 1

我有一个起始IPv4 IP地址5.39.28.128 (或::ffff:5.39.28.128)和IPv6网络掩码长度122,如何计算该范围内的最后一个IP?

我认为我需要将起始IP转换为二进制,如下所示,我不知道从那里获取结束IP。

代码语言:javascript
复制
$ipNumber = ip2long('5.39.28.128');
$ipBinary = decbin($ipNumber);

echo $ipBinary; // 101001001110001110010000000

原因是我要将CSV格式的MaxMind GeoIP数据库导入到MySQL数据库中(因此,如果需要,可以使用MySQL函数)。MaxMind不再提供结束IP,而是提供起始IP和IPv6网络掩码长度。

EN

回答 2

Stack Overflow用户

发布于 2014-06-02 18:44:53

给你。我从this response to another question复制了inet_to_bits函数。

代码语言:javascript
复制
<?php

function inet_to_bits($inet) {
   $inet = inet_pton($inet);
   $unpacked = unpack('A16', $inet);
   $unpacked = str_split($unpacked[1]);
   $binaryip = '';
   foreach ($unpacked as $char) {
             $binaryip .= str_pad(decbin(ord($char)), 8, '0', STR_PAD_LEFT);
   }
   return $binaryip;
}

function bits_to_inet($bits) {
    $inet = "";
    for($pos=0; $pos<128; $pos+=8) {
        $inet .= chr(bindec(substr($bits, $pos, 8)));
    }
    return inet_ntop($inet);
}

$ip = "::ffff:5.39.28.128";
$netmask = 122;

// Convert ip to binary representation
$bin = inet_to_bits($ip);

// Generate network address: Length of netmask bits from $bin, padded to the right
// with 0s for network address and 1s for broadcast
$network = str_pad(substr($bin, 0, $netmask), 128, '1', STR_PAD_RIGHT);

// Convert back to ip
print bits_to_inet($network);

输出:

代码语言:javascript
复制
::ffff:5.39.28.191
票数 4
EN

Stack Overflow用户

发布于 2014-06-06 18:11:07

解决方案非常简单:

代码语言:javascript
复制
// Your input data
$networkstart = '5.39.28.128';
$networkmask = 122;

// First find the length of the block: IPv6 uses 128 bits for the mask
$networksize = pow(2, 128 - $networkmask);

// Reduce network size by one as we really need last IP address in the range,
// not first one of subsequent range
$networklastip = long2ip(ip2long($networkstart) + $networksize - 1);

$networklastip将拥有该范围内的最后一个IP地址。

现在,对于IPv6地址空间中的IPv4地址,这是一个很好的解决方案。否则,您需要使用IPv6 to/from 128位整数函数,而不是ip2long/long2ip 2ip。但是,上面的MaxMind数据代码就足够了,因为我还没有看到来自它们的任何实际的IPv6数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23934176

复制
相关文章

相似问题

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