1、适用于标准 IP地址范围 解析成:单个标准 IP地址 格式,例如:192.168.1.1-192.168.1.10
// 无数多个:IP地址范围 解析 单个ip-->校验
export const analysisScope = (ipScope) => {
// const data = ipScope //当data是数组时
const data = ipScope.split(',') //当data是字符串时,(依逗号隔开为例)
// 定义IP地址范围的正则表达式
const ipRangeRegex = /^([0-9]{1,3}.){3}[0-9]{1,3}-([0-9]{1,3}.){3}[0-9]{1,3}$/;
const ipArray = [];// 正确IP地址
const ipRangeArray = [];// 正确IP地址范围
const mistakeArray = [];// 错误IP地址
// 获取 正确、错误 的IP地址范围
data.map((item) => {
if (ipRangeRegex.test(item)) {
ipRangeArray.push(item)
} else {
mistakeArray.push(item)
}
});
// 解析 ipRangeArray数组 IP地址范围转为单个IP
ipRangeArray.forEach(range => {
let [start, end] = range.split("-");
start = start.split(".").map(Number);
end = end.split(".").map(Number);
for (let i = start[0]; i <= end[0]; i++) {
for (let j = start[1]; j <= end[1]; j++) {
for (let k = start[2]; k <= end[2]; k++) {
for (let l = start[3]; l <= end[3]; l++) {
ipArray.push(`${i}.${j}.${k}.${l}`);
}
}
}
}
});
return { ipRangeArray, ipArray, mistakeArray }
};
2、适用于多个标准 IP地址/掩码长度 解析成:单个标准 IP地址 格式,例如:192.168.1.1/24
// 无数多个:IP地址/掩码长度 解析 单个ip-->校验
export const analysisSubnetMask = (ipScope) => {
// const data = ipScope //当data是数组时
const data = ipScope.split(',') //当data是字符串时,(依逗号隔开为例)
// 定义IP地址范围的正则表达式
const subnetRegex = /^([0-9]{1,3}\.){3}[0-9]{1,3}\/([0-9]|[1-2][0-9]|3[0-2])$/;
const ipArray = [];// 正确IP地址,
const subnetArray = [];//正确 IP地址/掩码长度
const mistakeArray = [];//错误IP地址
// 获取 正确、错误 的IP地址/掩码长度
data.map((item) => {
if (subnetRegex.test(item)) {
subnetArray.push(item)
} else {
mistakeArray.push(item)
}
});
// 将IP地址子网掩码 转为单个IP
// 将IP地址转换为十进制表示
function ipToDecimal (ip) {
var parts = ip.split(".");
return (parseInt(parts[0]) << 24) + (parseInt(parts[1]) << 16) + (parseInt(parts[2]) << 8) + parseInt(parts[3]);
}
// 将十进制表示的IP地址转换为常规IP地址
function decimalToIp (decimal) {
var part1 = (decimal >> 24) & 255;
var part2 = (decimal >> 16) & 255;
var part3 = (decimal >> 8) & 255;
var part4 = decimal & 255;
return part1 + "." + part2 + "." + part3 + "." + part4;
}
// 获取子网地址
function getSubnet (ip, maskLength) {
var decimalIp = ipToDecimal(ip);
var mask = Math.pow(2, 32 - maskLength) - 1;
var subnet = decimalIp & ~mask;
return subnet;
}
// 获取广播地址
function getBroadcast (ip, maskLength) {
var decimalIp = ipToDecimal(ip);
var mask = Math.pow(2, 32 - maskLength) - 1;
var broadcast = decimalIp | mask;
return broadcast;
}
// 获取可用的IP地址范围
function getUsableIps (ip, maskLength) {
var subnet = getSubnet(ip, maskLength);
var broadcast = getBroadcast(ip, maskLength);
var usableIps = [];
for (var i = subnet + 1; i < broadcast; i++) {
usableIps.push(decimalToIp(i));
}
return usableIps;
}
// 将IP地址和子网掩码长度转换为可用的IP地址范围
function convertIp (ipWithMask) {
var parts = ipWithMask.split("/");
var ip = parts[0];
var maskLength = parseInt(parts[1]);
var usableIps = getUsableIps(ip, maskLength);
return usableIps;
}
// 遍历子网数组,将每个子网的可用IP地址范围添加到ipArray中
for (let i = 0; i < subnetArray.length; i++) {
ipArray.push(...convertIp(subnetArray[i]))
}
// 解析 subnetArray
return { subnetArray, ipArray, mistakeArray }
};
3、验证:全新vue2项目