i have method converts ipv6 address decimal value.
at moment result is:
4.254076641128259e+37 but need this:
42540766411282592857539836924043198464 my code:
var ip = '2001:0db8:0:0:8d3:0:0:0'; var address = new v6.address(ip); var bin = address.binaryzeropad(); var dec = 0; (var = 0; < bin.length; i++) { dec = dec + parseint(bin[i]) * math.pow(2, bin.length - 1 - i); } console.log(dec); im using ip-address lib convert ipv6 first binary.
you cannot represent unsigned 128 bit number javascript number without loosing precision. javascript number allows storage of integers 2^53. see what javascript's highest integer value number can go without losing precision?
see 08d3 group has been lost...
var dec = 42540766411282592857539836924043198464; console.log(dec.tostring(16)) // ==> 20010db8000000000000000000000000 an alternative use library simulate arbitrary large integers, biginteger (wtfpl license).
example corresponding fiddle
var ip = '2001:0db8:0:0:8d3:0:0:0'; // simulate 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); output
42540766411282592857539836924043198464
Comments
Post a Comment