0
点赞
收藏
分享

微信扫一扫

华为机试HJ18 识别有效的IP地址和掩码并进行分类统计

ZMXQQ233 2022-04-30 阅读 70

描述
请解析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均为非法子网掩码)

注意:

  1. 类似于【0...】和【127...】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
  2. 私有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();
举报

相关推荐

0 条评论