我们所知道的IP地址只是32位数字值的字符串表示。
通过将字符串表示转换回其数字值,使用本地数字比较轻松地检查地址范围内的成员身份,如以下代码所示:
var atoi = function atoi(addr) {
var parts = addr.split('.').map(function(str) {
return parseInt(str);
});
return (parts[0] ? parts[0] << 24 : 0) +
(parts[1] ? parts[1] << 16 : 0) +
(parts[2] ? parts[2] << 8 : 0) +
parts[3];
};
var checkIpaddrInRange = function checkIpaddrInRange(ipaddr, start, end) {
var num = atoi(ipaddr);
return (num >= atoi(start)) && (num <= atoi(end));
}
checkIpaddrInRange('10.0.1.1', '10.0.0.1', '10.0.2.1');
checkIpaddrInRange('10.0.3.1', '10.0.0.1', '10.0.2.1');
请查看示例。
这里是完全注释和正确检查错误的相同内容:
var assertIsIpaddr = function assertIsIpaddr(ipaddr) {
if('string' !== typeof ipaddr && ipaddr) {
throw new Error('ipaddr must be a non-empty string');
}
var parts=ipaddr.split(/\./);
if(parts.length !== 4){
throw new Error('ipaddr must have four octets');
}
var i=0;
parts.map(function(str){
var val=parseInt(str),
octet = 4 - i++;;
if(val < 0 || val > 255){
throw new Error('octet '+octet+' must be between 0 and 255');
}
});
};
var atoi = function atoi(addr) {
assertIsIpaddr(addr);
var parts = addr.split('.').map(function(str) {
return parseInt(str);
});
var result = (parts[0] ? parts[0] << 24 : 0) +
(parts[1] ? parts[1] << 16 : 0) +
(parts[2] ? parts[2] << 8 : 0) +
parts[3];
if(result < 0) {
throw new Error('255.255.255.255 is not a legal host ipaddr');
}
return result;
};
var checkIpaddrInRange = function checkIpaddrInRange(ipaddr, start, end) {
var num = atoi(ipaddr);
return (num >= atoi(start)) && (num <= atoi(end));
}
checkIpaddrInRange('10.0.1.1','10.0.0.1','10.0.2.1');
checkIpaddrInRange('10.0.3.1','10.0.0.1','10.0.2.1');
(cidr & ip) == cidr
)。 - ssube