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

这段代码实现了一个IP地址和子网掩码的分类与验证功能。它首先读取多行输入的IP地址和子网掩码,然后通过检查IP地址的类别(A、B、C、D、E)、子网掩码的合法性以及是否为私有IP,将它们分类并统计各类别的数量。同时,还检查了IP地址和子网掩码的格式是否正确。最后,输出各类地址、错误IP地址或错误掩码以及私有IP的数量。
摘要由CSDN通过智能技术生成

描述
请解析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类地址是不冲突的

输入描述
多行字符串。每行一个IP地址和掩码,用~隔开。
请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。
输出描述
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
实例
输入

10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19…0.~255.255.255.0

输出

1 0 1 0 0 2 1

JavaScript代码

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值