跨网段校验 实现地址IP比较大小(终止IP大于起始IP)
思路
笔者在听到这个需求后表示很懵,了解过后才知道是 地址对象 在选择范围的情况下,终止IP 是需要大于起始IP的,那么在跨网段的情况下该如何比较呢
在这里,笔者有两种思路。
1.第一种 大概是 大家脑子里会不由自主的想到通过 字符串分割ip 地址 来比较数组前三位的方法
如果前三位都符合的话 那么再去比较最后一位。如果最后一位 的大小符合逻辑,那么校验通过
当然 如果 前三位不相等 就属于跨网段 我们还需要去比较 网段大小
2.第二种:说起来第二种了 也是受了旁边那位同事的启发 在其帮助下实现了这个逻辑 就是把字符串类型转换为 Long类型 自动校验是否跨网段,在这里我为大家介绍一下第二种方法,亲测好用!!
代码实现如下:
//这里声明一个自定义方法用来校验 正则IP是否通过
const validateVal = (obj, pattern = IP_PATTERN) => {
if (!(obj.val && new RegExp(pattern).test(obj.val))) {
obj.isError = false;
nextTick(() => {
setTimeout(() => {
obj.isError = true;
}, 100);
});
return false;
}
obj.isError = false;
return true;
};
// 此方法是将 输入ip进行分割 循环 位移 来返回 转成long类型后的数字
const validateIpToLong = (ipStr) => {
let ips = ipStr.split(".");
let ipNumber = 0;
for (var i = ips.length; i > 0; i--) {
let leftPosition = parseInt(ips[i]) << (8 * (3 - i));
ipNumber += leftPosition;
}
return ipNumber;
};
//输入ip 失去焦点后 的方法
//先校验 起始ip终止ip是否符合正则校验
const validateValStop = () => {
if (
!(
validateVal(state.hostCollection[0]) &&
validateVal(state.hostCollection[1])
)
) {
return false;
} else {
//在这里 我们将进一步获取 两个ip转换成Long类型的值
const ipOne = validateIpToLong(state.hostCollection[0].val);
const ipTwo = validateIpToLong(state.hostCollection[1].val);
//比较大小 来进行 错误提示
if (ipTwo - ipOne > 0) {
return true;
} else {
nextTick(() => {
setTimeout(() => {
state.hostCollection[0].isError = true;
}, 100);
});
return false;
}
}
};