node.js 实现php的ip2long

php有两个方法ip2long和long2ip,用于ip字符串和数字化ip之间转换。

$gateway = "192.168.31.1";
$netmask = "255.255.255.0";
//网络地址
$ip1 = ip2long($gateway) & ip2long($netmask);
//广播地址
$ip2 = ip2long($gateway) | (~ip2long($netmask));

那么node.js也可以实现:

function ip2long(ip_address, maxNum=256) {
  var output = false;
  var parts = ip_address.split ( '.' );
  var output = 0;
  //output=( parts[0]*Math.pow(256,3))+(parts[1]*Math.pow(256,2))+( parts[2]*Math.pow(256,1))+(parts[3]*Math.pow(256,0));
  for(let i=0;i<parts.length;i++){
    output+=parts[i] * Math.pow(maxNum, parts.length-1-i);
  }
  return output<<0 ;
}

long2ip用node.js实现:

function long2ip(proper_address, partNum=4, maxNum=256) {
  proper_address = proper_address>>>0;
/*
var output = false;
output = Math.floor(proper_address/Math.pow(256,3))+'.'+
Math.floor((proper_address%Math.pow(256,3))/Math.pow(256,2))+'.'+
Math.floor(((proper_address%Math.pow(256,3))%Math.pow(256,2))/Math.pow(256,1))+'.'+
Math.floor((((proper_address%Math.pow(256,3))%Math.pow(256,2))%Math.pow(256,1))/Math.pow(256,0));
*/
  pows=new Array(partNum);
  var output=new Array();
  for(let i=0;i<partNum;i++){
    pows[i]=Math.pow(maxNum,partNum-1-i);
  }
  for(let i=0;i<partNum;i++){
    let curResult=proper_address;
    let m=0;
    for(let n=i;n>=0;n--){
      if(m!=i){
        curResult=curResult % pows[m];
      }else{
        curResult=curResult / pows[m];
      }
      m++;
    }
    output.push(Math.floor(curResult));
  }
  return output.join('.');
}

使用例子:

let ipval=ip2long('192.168.31.100',256);
console.log(ipval); //结果-1062723740
console.log(long2ip(ipval,4,256)); //结果192.168.31.100

使用简单。附ip递增+1代码:

function ip_increment(decStr, maxNum=256){
  //increment
  let bytes=decStr.split('.').map(Number);
  for (let i = bytes.length - 1; i >= 0; i--) {
    bytes[i]++;
    if (bytes[i] <= maxNum){
      break;
    }else{
      bytes[i]=0;
    }
  }
  return bytes.map(byte => byte.toString(10)).join('.');
  // 使用示例
  //const testStr = '192.168.31.112';
  //const nextStr = ip_increment(testStr);
  //console.log(nextStr); // 结果将输出 '192.168.31.113'
}
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注