Nodejs IPv6解析轉換成BigInteger整形數字

這裏只討論IPv6轉成整形,整形到IPv6請見《Nodejs: 整形數字轉IPv6》

IPv6的解析與轉換目前最方便的做法是使用第三方包ip-address將IPv6轉換成jsbn.BigInteger。經測試,在nodejs 4.6,8.16,10.4等三個版本上都能正常使用。

 npm install ip-address

如果要自己寫的話,因爲IPv6支持0的壓縮表示以及對IPv4的兼容,所以解析是比較麻煩的,另一個比較麻煩的原因是IpV6是128bit,必須用BigInt才能保存,而nodejs從v10.4.1纔開始支持BigInt,一般的數字類型不能用的原因是會被表示爲科學計數法,而且後面若干位會被置爲0。

示例:

var Address6 = require('ip-address').Address6;


//參數:ipv6str字符串
//返回:jsbn.BigInteger的一個實例
var Ipv6ToBigInt = function (ipv6str) {
    var address = new Address6(ipv6str);
    if (address.isValid() == false) {
        throw new Error("invalid ipv6")
    }
    return address.bigInteger();
};

var convert = function (ipv6str) {
    try {
        var addr = Ipv6ToBigInt(ipv6str);
        console.log(ipv6str + " -> " + addr.toString());
    } catch (err) {
        console.log(ipv6str + " -> " + err);
    }
};

var addr1 = Ipv6ToBigInt("2001:024f:ffff:ffff:ffff:ffff:ffff:fff1");
var addr2 = Ipv6ToBigInt("2001:024f:ffff:ffff:ffff:ffff:ffff:fff4");

console.log("addr1:" + addr1.toString());
console.log("addr2:" + addr2.toString());
console.log("addr1 < addr2:" + (addr1.compareTo(addr2) < 0));
console.log("addr1 > addr2:" + (addr1.compareTo(addr2) > 0));

console.log("\n特殊情況,包括0壓縮和IPv4的映射到IPv6");
convert("::");
convert("2001::");
convert("::2001");
convert("2001:024f::ffff:ffff:fff4");
convert("::ffff:10.2.3.45");
convert("::10.2.3.45");
convert("::a02:32d");

console.log("\n非法ipv6");
convert("10.2.3.45");
convert("2001:024f::ffff::ffff:fff4");
convert("2001:024f::ffff:ffff:fff41");
convert("2001:024f:ffff:fff4");

console.log("\nipv6查看字節");
var address = new Address6("2001:024f::ffff:ffff:ffff:fffa");
console.log(address.toUnsignedByteArray());

輸出:

addr1:42540535065048051205038211803318845425
addr2:42540535065048051205038211803318845428
addr1 < addr2:true
addr1 > addr2:false

特殊情況,包括0壓縮和IPv4的映射到IPv6
:: -> 0
2001:: -> 42540488161975842760550356425300246528
::2001 -> 8193
2001:024f::ffff:ffff:fff4 -> 42540534985819888690774155684751605748
::ffff:10.2.3.45 -> 281470849647405
::10.2.3.45 -> 167904045
::a02:32d -> 167904045

非法ipv6
10.2.3.45 -> Error: invalid ipv6
2001:024f::ffff::ffff:fff4 -> Error: invalid ipv6
2001:024f::ffff:ffff:fff41 -> Error: invalid ipv6
2001:024f:ffff:fff4 -> Error: invalid ipv6

ipv6查看字節
[ 32, 1, 2, 79, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 250 ]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章