【无标题】ip地址和子网掩码格式校验


一.学习到的知识(ip地址和子网掩码校验)

1. 输入框使用正则限制输入

input输入框要限制只能输入数字设置 type=“number” 使用其他的UI组件或多或少都会带有默认样式,input输入框可以有oninput监听时间使用正则可以把用户输入的不符合正则的替换成空字符串。
例如:

<el-input oninput="value=value.replace(/[^0-9]/g,'')" v-model="mainForm.VLAN_ID" size="small" placeholder="VLAN ID">
</el-input>

2.使用正则匹配IP地址并且区分(A,B,C,广播,保留地址)

function judgeIpType(ip) {
  // ip地址 , A类地址, B类地址, C类地址正则
  let ipReg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;

  let AReg = /^(\d|[1-9]\d|1[0-1]\d|12[0-7])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}/;

  let BReg = /^(12[8-9]|1[3-8]\d|19[0-1])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}/;

  let CReg = /^(19[2-9]|2[0-1]\d|22[0-3])((\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))){3}/;

  if (!ipReg.test(ip)) {

    return false;

  } else if (AReg.test(ip)) {

    return 'A';

  } else if (BReg.test(ip)) {

    return 'B';

  } else if (CReg.test(ip)) {

    return 'C';

  } else {

    // D,E地址

    return false;

  }

}

3.校验子网掩码格式要求

 知识:
 1.按位 & 运算 两个二进制数进行&运算  1&1 = 1 1&0 = 0
 2.二进制和十进制相互转换
 二进制 => 十进制   (168).toString(2) => '10101000'
 十进制 => 二进制   parseInt('10101000',2) => 168 
 ob1010表示二进制数

子网掩码 例如255.255.255.0 将这四段都转换成8位数二进制字符串然后并在一起得到32位二进制数字

如果该字符串前面是1后面是0则合法 全是1或者全是0不合法的

A,B,C类IP地址默认子网掩码:
defaultMaskA = ‘255.0.0.0’;
defaultMaskB = ‘255.255.0.0’;
defaultMaskC = ‘255.255.255.0’;


function _checkIput_fomartIP(ip) {

 return (ip + 256).toString(2).substring(1); //格式化输出(补零)

}

utilTool.validateMask = function (MaskStr) {

 var IPArray = MaskStr.split('.');

 var ip1 = parseInt(IPArray[0]);

 var ip2 = parseInt(IPArray[1]);

 var ip3 = parseInt(IPArray[2]);

 var ip4 = parseInt(IPArray[3]);

 let count = 0;

 if (ip1 < 0 || ip1 > 255 || ip2 < 0 || ip2 > 255 || ip3 < 0 || ip3 > 255 || ip4 < 0 || ip4 > 255) {

   return false;

 }

 var ip_binary = _checkIput_fomartIP(ip1) + _checkIput_fomartIP(ip2) + _checkIput_fomartIP(ip3) + _checkIput_fomartIP(ip4);

 if (-1 != ip_binary.indexOf('01')) {

   return false;

 }

 // 全是0或者全是1的也判断错误

 for (let i = 0; i < ip_binary.length; i++) {

   if (ip_binary[i] == '0') {

     count++;

   }

 }

 if (count == 32) return false;

 count = 0;

 for (let i = 0; i < ip_binary.length; i++) {

   if (ip_binary[i] == '1') {

     count++;

   }

 }

 if (count == 32) return false;

 return true;

};

4.简单的将十进制数转换成8位二进制数不足补0

//将ip地址转换成32位二进制数字

function to32bitStr(ip) {

  let arr = ip.split('.');

  let str = '';

  arr.map((item) => {

    str += (parseInt(item) + 256).toString(2).substring(1);

  });

  return str;

}
// 转换成8位的二进制数不足的前面补零

function to8Bit(number) {

  var result = parseInt(number).toString(2);

  while (result.length < 8) {

    result = '0' + result;

  }

  return result;

}

5.简单判断两台设备能否相互通信

如果两个设置都在同一个子网或者说是同一个网段下是可以相互通信的如何判断两台设备在同一个网段下呢?简单的方式是各自的ip和子网掩码进行&运算 如果两台主机结果相同那么他们就是在同一个网段下

// 前提是ip和子网掩码符合相应的格式

utilTool.judgeIsTalk = function (ip1, mask1, ip2, mask2) {

  if (to32bitStr(ip1) == to32bitStr(ip2)) {

    console.log('IP相同');

    return false;

  }

  if ((to32bitStr(ip1) & to32bitStr(mask1)) == (to32bitStr(ip2) & to32bitStr(mask2))) {

    console.log('在同一个网段!');

    return true;

  } else {

    console.log('不在同一个网段!');

    return false;

  }

};

二. 遇到的问题

经常要对表单数据进行操作有的时候会发现表单数据是错的或者没有清空所以最后对表单对象进行深拷贝 JSON.parse(JSON.stringify(form))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值