我有一个将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首先转换为二进制。
答案 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
另一种方法是使用另一个库来模拟任意大整数,例如BigInteger(WTFPL许可证)。
相应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