2015-04-10 1 views
-1

Alors disons que j'ai var testIP = '93.174.93.145';Perdre un peu lors de la conversion en JavaScript?

Et je joue des méthodes suivantes:

function ipToBin(ip) { 
    var block = ip.split('.'); 
    var res = 0; 

    res += block[0] << 24; 
    res += block[1] << 16; 
    res += block[2] << 8; 
    res += block[3] << 0; 

    bin = res.toString(2); 
    console.log('\n to bin: ', bin); 
    console.log(bin.length); 
    return bin; 
} 

function binToIP(bin) { 
    var block1 = (bin.split(0, 8)); 
    block1 = parseInt(block1, 2); 
    block1 = (block1 >> 0) & 255; 

    var block2 = bin.split(9, 8); 
    block2 = parseInt(block2, 2); 
    block2 = (block2 >> 8) & 255; 

    var block3 = bin.split(17, 8); 
    block3 = parseInt(block3, 2); 
    block3 = (block3 >> 16) & 255; 

    var block4 = bin.split(25, 8); 
    block4 = parseInt(block4, 2); 
    block4 = (block4 >> 24) & 255; 

    console.log((block4 + '.' + block3 + '.' + block2 + '.' + block1).toString()); 
} 


Maintenant, la chose est que la longueur de chaîne binaire est seulement 31 et quand reconverti en IP, il renvoie 93.174.93.1. Est-ce similaire à this post? Où se trouve exactement le problème auquel je suis confronté?

Répondre

2

Le problème principal est que toString(2) ne produira que le nombre de chiffres dont il a besoin, et il n'a besoin que de 31. Donc, lorsque vous faites votre manipulation de chaîne en binToIP, qui repose sur 32 chiffres, vous vous retrouvez avec la mauvaise valeur.

Je ne ferais pas de manipulation de chaîne dans binToIP du tout, je ferais juste l'inverse de ce que vous faites dans iptoBin: Analyser un nombre, puis faire la manipulation de bits pour obtenir les bits individuels, puis les former en une chaîne:

function binToIP(bin) { 
    var value = parseInt(bin, 2); 
    var block1 = (value & 0xFF000000) >> 24; 
    var block2 = (value & 0x00FF0000) >> 16; 
    var block3 = (value & 0x0000FF00) >> 8; 
    var block4 = value & 0x000000FF; 
    var ip = block1 + "." + block2 + "." + block3 + "." + block4; 

    return ip; 
} 

un exemple concret:

var testIP = '93.174.93.145'; 
 
snippet.log("Original IP: " + testIP); 
 
var bin = ipToBin(testIP); 
 
snippet.log("bin: " + bin); 
 
var rebuiltIP = binToIP(bin); 
 
snippet.log("Rebuilt IP : " + rebuiltIP); 
 

 
function ipToBin(ip) { 
 
    var block = ip.split('.'); 
 
    var res = 0; 
 

 
    res += block[0] << 24; 
 
    res += block[1] << 16; 
 
    res += block[2] << 8; 
 
    res += block[3] << 0; 
 

 
    bin = res.toString(2); 
 
    return bin; 
 
} 
 

 
function binToIP(bin) { 
 
    var value = parseInt(bin, 2); 
 
    var block1 = (value & 0xFF000000) >> 24; 
 
    var block2 = (value & 0x00FF0000) >> 16; 
 
    var block3 = (value & 0x0000FF00) >> 8; 
 
    var block4 = value & 0x000000FF; 
 
    var ip = block1 + "." + block2 + "." + block3 + "." + block4; 
 

 
    return ip; 
 
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>