javascript - IPv6 作为可比较的 JavaScript 字符串?

标签 javascript ipv6

序言

在 IPv4 时代,事情很容易,因为 IPv4 地址可以转换为简单的 32 位整数,然后用于各种比较计算。

对于 IPv6,这有点尴尬,因为一方面,JavaScript 本身不支持 128 位整数,而且它们的转换一点也不简单。这只留下处理 IPv6 字符串表示的选项。

问题

如何将任何已知格式的 IPv6 地址转换为可比较的字符串?

要求

  1. 对于任何可比较的字符串,如果地址 A 在地址 B 之前,则条件 A < B必须生产true在 JavaScript 中。类似的逻辑必须对其余比较有效:=== , <= , >>= .
  2. 对于每个 IPv6,必须生成尽可能多的字符串以覆盖地址中的每个范围,即每个范围的起始地址 + 结束地址。

最佳答案

将简化的 IPv6 地址格式转换为完整格式并不难。只有 3 条规则可以简化地址。以下是按顺序列出的规则,必须撤消这些规则才能将地址​​转换回完整格式:

  1. 点分四组表示法(IPv4 地址嵌入在 IPv6 地址中)

  2. 可以省略前导零

  3. 零组可以缩写为 ::

从技术上讲,根据您的处理方式,2 和 3 可能会互换。

所以这里有一个简单的转换器,它只转换有效的 IPv6 地址(如果你向它提供无效的 IPv6 地址,它肯定会失败,因为我没有做任何验证):

function full_IPv6 (ip_string) {
    // replace ipv4 address if any
    var ipv4 = ip_string.match(/(.*:)([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$)/);
    if (ipv4) {
        var ip_string = ipv4[1];
        ipv4 = ipv4[2].match(/[0-9]+/g);
        for (var i = 0;i < 4;i ++) {
            var byte = parseInt(ipv4[i],10);
            ipv4[i] = ("0" + byte.toString(16)).substr(-2);
        }
        ip_string += ipv4[0] + ipv4[1] + ':' + ipv4[2] + ipv4[3];
    }

    // take care of leading and trailing ::
    ip_string = ip_string.replace(/^:|:$/g, '');

    var ipv6 = ip_string.split(':');

    for (var i = 0; i < ipv6.length; i ++) {
        var hex = ipv6[i];
        if (hex != "") {
            // normalize leading zeros
            ipv6[i] = ("0000" + hex).substr(-4);
        }
        else {
            // normalize grouped zeros ::
            hex = [];
            for (var j = ipv6.length; j <= 8; j ++) {
                hex.push('0000');
            }
            ipv6[i] = hex.join(':');
        }
    }

    return ipv6.join(':');
}

您可能可以在 .split(':') 之后进行嵌入式 IPv4 处理但我已经在考虑正则表达式的情况下编写了它。从上面的代码可以看出,这个过程的每一步都相当简单。唯一让我绊倒的是 j<=8 中的一个差一错误最后一个 for 循环中的条件。

关于javascript - IPv6 作为可比较的 JavaScript 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30329991/

相关文章:

ios - 使用 OSX 10.11 Beta 5 (El Capitan) 设置 IPv6 环境

javascript - Magento:bundle.js 中捆绑产品的 'Bug' 的等级定价 "Price as Configured"

javascript 真实数字

javascript - 收到验证错误,但表单正在使用 ajax 和 PHP 提交

c# - 我如何从 javascript 读取 DataTable

postgresql - 查看 IP 地址是否在子网列表中的有效方法

javascript - View 和模型中的日期与 POST 中的日期不同

ruby-on-rails - 为什么Puma只绑定(bind)tcp6? (通过 `rails s` )

javascript - 如何在node.js中识别IPV6私有(private)地址和环回地址?

c# - 如何将 ipv6 地址解析为 "octets"?