在Javascript

时间:2015-07-16 11:40:01

标签: javascript node.js

我有一个将IPv6地址转换为十进制值的方法。

目前我的结果是:

4.254076641128259e+37

但我需要这个:

42540766411282592857539836924043198464

我的代码:

var ip = '2001:0db8:0:0:8d3:0:0:0';
var address = new v6.Address(ip);
var bin = address.binaryZeroPad();
var dec = 0;
for (var i = 0; i < bin.length; i++) {
    dec = dec + parseInt(bin[i]) * Math.pow(2, bin.length - 1 - i);
}
console.log(dec);

我使用ip-address lib将IPv6首先转换为二进制。

1 个答案:

答案 0 :(得分:2)

在不失去精度的情况下,不能将无符号的128位数表示为JavaScript数。 JavaScript Number仅允许存储最多2 ^ 53的整数。见What is JavaScript's highest integer value that a Number can go to without losing precision?

看到08d3组已经丢失......

var dec = 42540766411282592857539836924043198464;
console.log(dec.toString(16))
// ==> 20010db8000000000000000000000000

另一种方法是使用另一个库来模拟任意大整数,例如BigIntegerWTFPL许可证)。

相应fiddle

的示例
var ip = '2001:0db8:0:0:8d3:0:0:0';

// simulate your address.binaryZeroPad(); method
var parts = [];
ip.split(":").forEach(function(it) {
    var bin = parseInt(it, 16).toString(2);
    while (bin.length < 16) {
        bin = "0" + bin;
    }
    parts.push(bin);
})
var bin = parts.join("");

// Use BigInteger library
var dec = bigInt(bin, 2).toString();
console.log(dec);

输出

42540766411282592857539836924043198464