在JavaScript中转换时会丢失一点吗?

在JavaScript中转换时会丢失一点吗?,javascript,ip,bit-manipulation,bit,Javascript,Ip,Bit Manipulation,Bit,假设我有一个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;

假设我有一个
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());
}
功能ipToBin(ip){
var block=ip.split('.');
var-res=0;
res+=块[0]8)&255;
var block3=仓位分割(17,8);
block3=parseInt(block3,2);
block3=(block3>>16)和255;
var block4=仓位分割(25,8);
block4=parseInt(block4,2);
block4=(block4>>24)和255;
log((block4+'.+block3+'.+block2+'.+block1.toString());
}


现在的问题是二进制字符串的长度只有31,当转换回IP时,它返回
93.174.93.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';
log(“原始IP:+testIP”);
var-bin=ipToBin(testIP);
log(“bin:+bin”);
var再过滤=binToIP(bin);
log(“重建的IP:+RebuildIP”);
功能ipToBin(ip){
var block=ip.split('.');
var-res=0;
res+=块[0]16;
var block3=(值&0x0000FF00)>>8;
var block4=值&0x000000FF;
var ip=block1+“+block2+”+block3+“+block4;
返回ip;
}