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

vit*_*y-t 1 javascript ipv6

前言

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

使用IPv6有点尴尬,因为一方面,JavaScript本身不支持128位整数,并且它们的转换根本不是直截了当的.这只留下了处理IPv6字符串表示的选项.

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

要求

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

sle*_*man 5

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

  1. 虚线四元表示法(嵌入在IPv6地址中的IPv4地址)

  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(':');
}
Run Code Online (Sandbox Code Playgroud)

你可以在之后进行嵌入式IPv4处理,.split(':')但我已经用regexp编写了它.从上面的代码可以看出,该过程的每个步骤都相当简单.绊倒我的唯一一件事就是j<=8在最后一个for循环中的条件中出现了一个错误.