描述
请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。
所有的IP地址划分为 A,B,C,D,E五类
A类地址从1.0.0.0到126.255.255.255;
B类地址从128.0.0.0到191.255.255.255;
C类地址从192.0.0.0到223.255.255.255;
D类地址从224.0.0.0到239.255.255.255;
E类地址从240.0.0.0到255.255.255.255
私网IP范围是:
从10.0.0.0到10.255.255.255
从172.16.0.0到172.31.255.255
从192.168.0.0到192.168.255.255
子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
(注意二进制下全是1或者全是0均为非法子网掩码)
注意:
- 类似于【0...】和【127...】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
- 私有IP地址和A,B,C,D,E类地址是不冲突的
const ipReg = /^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/;
const data = [];
let line;
while(line = readline()) {
const ipMask = line.split('~');
data.push({
ip: ipMask[0],
mask: ipMask[1],
});
}
function ipTest() {
const counter = { ipA: 0, ipB: 0, ipC: 0, ipD: 0, ipE: 0, ipMaskErr: 0, privateIp: 0 };
data.forEach((item) => {
//如ip:10.70.44.68。 取10 A类地址
const first = parseInt(item.ip.split('.')[0]);
// 0.x.x.x || 127.x.x.x 计数忽略;
if(first === 0 || first === 127) {
// continue;
} else if(!checkSubnetMask(item.mask)) {//判断子网掩码合法性
counter.ipMaskErr++;
} else if (!ipReg.test(item.ip)) {//判断ip格式 合法性
counter.ipMaskErr++;
} else {
if (isPrivateIP(item.ip)) {//判断私有ip
counter.privateIp++;
}
if (first > 0 && first < 127) {
counter.ipA++;
} else if (first > 127 && first < 192) {
counter.ipB++;
} else if (first > 191 && first < 224) {
counter.ipC++;
} else if (first > 223 && first < 240) {
counter.ipD++;
} else if (first > 239 && first < 256) {
counter.ipE++;
}
}
});
console.log(counter.ipA+" "+counter.ipB+" "+counter.ipC+" "+counter.ipD+" "+counter.ipE+" "+counter.ipMaskErr+" "+counter.privateIp);
}
function checkSubnetMask(mask) {
let isValid = true;//默认为ture 主要出现了false 就是false
const ipArr = mask.split('.');
let binaryStr = '';
ipArr.forEach((subnet) => {
//为了补0 本来有8位,加上256后 有九位,比如111只有7位:1101111
//而应该01101111 ,111+256=367,101101111 为九位,取substring(1)就是8位了
binaryStr += (parseInt(subnet) + 256).toString(2).substring(1); // 补零
});
//子网掩码都是 前面全1 后面全0。如A类为255.0.0.0。B类为255.255.0.0
//比如255.254.0.0:11111111 11111101 00000000 00000000 出现了01错误的子网掩码
if (binaryStr.indexOf('01') > -1) {
isValid = false;
}
else if (binaryStr.indexOf('1') < 0 || binaryStr.indexOf('0') < 0) {
// 全1,全零 不出现1即为全0,不出现1即为全1
isValid = false;
}
return isValid;
}
function isPrivateIP(ip) {
let flag = false;
const arr = ip.split('.');
const first = parseInt(arr[0]);
const second = parseInt(arr[1]);
if ((first === 10) || (first === 172 && (second >= 16 && second <= 31)) || (first === 192 && second === 168)) {
flag = true;
}
return flag;
}
ipTest();