问题描述
我有一种将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楼
您不能在不损失精度的情况下将无符号的128位数字表示为JavaScript数字。 JavaScript Number仅允许存储最大2 ^ 53的整数。 请参阅
看到08d3组已经丢失了...
var dec = 42540766411282592857539836924043198464;
console.log(dec.toString(16))
// ==> 20010db8000000000000000000000000
一种替代方法是使用另一个库来模拟任意大整数,例如 ( 许可证)。
带有相应示例
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