【问题标题】:Losing a bit when converting in JavaScript?在 JavaScript 中转换时丢失了一点?
【发布时间】:2015-06-15 22:37:06
【问题描述】:

假设我有一个var testIP = '93.174.93.145';

我正在执行以下方法:

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());
}


现在问题是二进制字符串的长度只有 31,当转换回 IP 时,它返回93.174.93.1。这类似于this post 吗?或者我面临的问题究竟出在哪里?

【问题讨论】:

    标签: javascript ip bit-manipulation bit


    【解决方案1】:

    主要问题是toString(2) 只会输出所需数量的数字,并且只需要 31 个。因此,当您在依赖 32 个数字的 binToIP 中进行字符串操作时,您将以错误的值结束。

    我根本不会在binToIP 中进行字符串操作,我只会与您在iptoBin 中所做的相反:将其解析为一个数字,然后进行位操作以获取各个位,然后将它们组成一个字符串:

    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;
    }
    

    活生生的例子:

    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>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 2022-09-17
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      相关资源
      最近更新 更多