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