识别有效的IP地址和掩码,并计数

题目:

在这里插入图片描述
在这里插入图片描述

解析:

题目的意思就是,很清晰!!!! 直接上代码 代码中的注释很清晰
欢迎互相交流

代码产出:

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
//  索引为2 3 4 5 6 7 8存放A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数
var ignore = [0, 0, 0, 0, 0, 0, 0]
// 用来验证是否为一个合法的掩码,确保0后面没有1  逆向  只要0后面不是0,则!reg.test() 则是合法的掩码
var reg = /0[^0]/g
// 用来验证全为数字
var reg1 = /^[0-9]*$/
rl.on('line', function (line) {
    fn(line)
    
    
});
// 设置定时器, 延时执行打印语句
setTimeout(() => {
    console.log(ignore.join(' ')) 
}, 500)
var fn = (line) => {
    var ip = line.split('~')[0]
    var mask = line.split('~')[1]
    var head = Number(ip.split('.')[0])
    var next = Number(ip.split('.')[1])
    // 当ip和掩码均为合法  计算地址类型
    if (isip(ip) && isMask(mask)){
        // 过滤【0.*.*.*】和【127.*.*.*】的IP地址  不计算
        if (head !== 0 || head !== 127) {
            if (head === 172 && next >= 16 && next <= 31 || head === 192 && next === 168 || head === 10) 
                ignore[6] ++
            if (head >= 1 && head <= 126) {
                // A地址
                ignore[0]++
            } else if (head >= 128 && head <= 191) {
                // B地址
                ignore[1]++
            } else if (head >= 192 && head <= 223) {
                // C地址
                ignore[2]++
            } else if (head >= 224 && head <= 239) {
                // D地址
                ignore[3]++
            } else if (head >= 240 && head <= 255) {
                // E地址
                ignore[4]++
            }
        }
    }
}

// 非法ip 当出现非数字,数字为负数 , 为空字符串
var isip = (ip) => {
    if (ip.split('.').some(item => Number(item) < 0 || !reg1.test(item))) {
        ignore[5]++
        return false
    }
    return true
}
// 非法掩码 
var isMask = (mask) => {
    // 当出现非数字,数字为负数 , 为空字符串
    if (mask.split('.').some(item => Number(item) < 0 || !reg1.test(item))){
        ignore[5]++
        return false
    }
    else if (mask === '0.0.0.0' || mask === '255.255.255.255') {// 当全部为0 或者 全部为1
        ignore[5]++
        return false
    } else if(MaskZeroNoOne(mask.split('.')).match(reg)){// 0 后面出现 1  这里使用reg.test(MaskZeroNoOne(mask.split('.')))不通过???
        ignore[5]++
        return false
    } else {
       return true 
    }
    
}


// 确保是一个64位的字符串
var MaskZeroNoOne = (arr) => {
    var str = ''
    for (let i=0;i<arr.length;i++) {
        if (parseInt(arr[i]).toString(2).length < 8) {
            str += addZero(parseInt(arr[i]).toString(2))
        } else {
            str += parseInt(arr[i]).toString(2)
        }
    }
    return str
}

// 掩码的二进制不够8位数自动补充
var addZero = (str) => {
    return '0'.repeat(8 - str.length) + str
}
    
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值