JS 实现I P地址分配

NetworkMgr = function() {

}
NetworkMgr.prototype = {
getIpAddressClass: function(address) {
var iaddress = this.toLong(address)
return this.getIpAddressClass0(iaddress);
},
getIpAddressClass0: function(iaddress) {
// var byte1 = iaddress >> 24;
var byte1 = iaddress / Math.pow(2, 24); // used to replace prior method :
// var byte1 = iaddress >> 24;
var clazz = null;
if (byte1 > 0 && byte1 <= 127)
clazz = "A";
else if (byte1 >= 128 && byte1 <= 191)
clazz = "B";
else if (byte1 >= 192 && byte1 <= 223)
clazz = "C";
else if (byte1 >= 224 && byte1 <= 255)
clazz = "D";
return clazz;
},

getNetworkMaskLength: function(address) {
var iaddress = this.toLong(address)
return this.getNetworkMaskLength0(iaddress);
},

getNetworkMaskLength0: function(iaddress) {
// var byte1 = iaddress >> 24;
var byte1 = iaddress / Math.pow(2, 24); // used to replace prior method :
// var byte1 = iaddress >> 24;
var length = -1;
if (byte1 > 0 && byte1 <= 127)
length = 8;
else if (byte1 >= 128 && byte1 <= 191)
length = 16;
else if (byte1 >= 192 && byte1 <= 223)
length = 24;
else if (byte1 >= 224 && byte1 <= 255)
length = 32;
return length;
},
available: function(from, to, maskLength) {
var network1 = null, network2 = null;
try {
network1 = this.getNetworkAddress(from, maskLength);
network2 = this.getNetworkAddress(to, maskLength);
} catch (e) {
throw 'Not a abailable ip address segment';
}
var availables = new Array();
if (network1 == null || network2 == null)
return availables;
// var step = 2 * (32 - maskLength);
var step = Math.pow(2, 32 - maskLength);
var count = (network2 - network1) / step;
var t = (network2 - network1) % step;
if (t != 0)
count++;
for (var i = 0; i <= count; i++) {
availables.push(network1);
network1 += step;
}
return availables;
},
availableSubnetAddress: function(address, addrMaskLength, maskLength) {
if (typeof address != "string")
throw 'Not a string type';
var iaddress = this.toLong(address);

return this.availableSubnetAddress0(iaddress, addrMaskLength, maskLength);
},
availableSubnetAddress0: function(iaddress, addrMaskLength, maskLength) {
if (typeof addrMaskLength != "number" || typeof maskLength != "number")
throw 'Not a number type';
if (typeof iaddress != "number")
throw 'Not a number type';

var count = Math.pow(2, maskLength - addrMaskLength);
var availables = new Array(count);
for (var i = 0; i < count; i++) {
availables[i] = iaddress + i * Math.pow(2, 32 - maskLength);
}
return availables;
},

getHostAddressArrange: function(address, maskLength) {
return this.toIpAddr(address + 1) + " ~ " +
this.toIpAddr(address + Math.pow(2, 32 - maskLength) - 2);
},

getEndIpAddress: function(startIpAddress, maskLength) {
var iEndAddress = this.getEndAddress(startIpAddress, maskLength);
return this.toIpAddr(iEndAddress);
},
getEndIpAddress0: function(iStartIpAddress, maskLength) {
var iEndAddress = this.getEndAddress0(iStartIpAddress, maskLength);
return this.toIpAddr(iEndAddress);
},

getEndAddress: function(startIpAddress, maskLength) {
var iStartAddress = this.toLong(startIpAddress);
return this.getEndAddress0(iStartAddress, maskLength);
},
getEndAddress0: function(iStartAddress, maskLength) {
// var iEndAddress = iStartAddress >> (32 - maskLength);
// iEndAddress = iEndAddress << (32 - maskLength);
var iEndAddress = iStartAddress / Math.pow(2, (32 - maskLength));// used to replace prior method :
// var iEndAddress = iStartAddress >> (32 - maskLength);
iEndAddress = iEndAddress * Math.pow(2, (32 - maskLength)); // used to replace prior method :
// iEndAddress = iEndAddress << (32 - maskLength);
iEndAddress += Math.pow(2, 32 - maskLength) - 1;
return iEndAddress;
},

toLong: function(ipAddr) {
var s = ipAddr.split('.');
if (s.length != 4)
throw 'Not a available ip format';
var n = 0;
for (var i = 0; i < s.length; i++) {
var si = s[i];
if (isNaN(si))
throw 'Not a number type';
// n = n << 8;
n = n * Math.pow(2, 8); // used to replace prior method : n = n << 8;
n = n + parseInt(si, 10);
if (isNaN(n))
throw 'Not a number type';
}
return n;
},
toIpAddr: function(_long) {
// if (isNaN(number))
if (typeof _long != "number")
throw 'Not a number type';
var b = _long.toString(2);
if (b.length != 32) {
for (var i = b.length + 1; i <= 32; i++) {
b = '0' + b;
}
}
var i = 0;
var seg = -8;
var s = '';
while (i <= 3) {
seg += 8;
var sub = b.substr(seg, 8);
var p = 0;
for (var j = 0; j < sub.length; j++) {
var tt = Math.pow(2, j);
var jj = sub.charAt(sub.length - 1 - j);
jj = parseInt(jj);
p += jj * tt;
}
s = s + p;
if (i != 3)
s = s + '.';
i++;
}
return s;
},
toNetwork: function(_long, maskLength) {
var ipAddr = this.toIpAddr(_long);
return ipAddr + '/' + maskLength;
},
getNetworkAddress0: function(number, maskLength) {
// if (isNaN(number) || maskLength)
if (typeof number != "number" || typeof maskLength != "number")
throw 'Not a number type';
var test = 2 << 1;
test = 2 << 2;
test = 2 << 3;
test = 3 << 2;
var t1 = Math.pow(2, 32) - 1;
var t2 = Math.pow(2, 32 - maskLength) - 1;
return number & (t1 - t2);
},
getNetworkAddress: function(ipAddr, maskLength) {
var n = this.toLong(ipAddr);
return this.getNetworkAddress0(n, maskLength);
},
getNetworkDestinationIpAddress: function(start, maskLength) {
var n = this.toLong(start);
n = n << (32 - maskLength);
var t = Math.pow(2, 32 - maskLength) -1;
n += t;
return n;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值