/**
* @description 通过ip地址和掩码位数,计算ip起始地址
* @param {ip:string, maskBit:number} ip地址 掩码位数
* @param string[]
*/
// 计算ip地址范围
function calculateIpRange(ip, maskBits) {
// 将 IP 地址转换为整数
const ipInt = ipToInt(ip);
// 计算掩码
const mask = -1 << (32 - maskBits);
// ip起始地址: 掩码数31,只有网络地址和广播地址; 否则不包含网络地址
let startIpInt = maskBits < 31 ? (ipInt & mask) + 1 : ipInt & mask;
// ip结束地址
let endIpInt = null;
if (maskBits < 32) {
// 掩码31位包含广播地址,小于31不包含广播地址
endIpInt = maskBits === 31 ? (ipInt & mask) + 2 ** (32 - maskBits) - 1 : (ipInt & mask) + 2 ** (32 - maskBits) - 2;
}
// 将整数转换为 IP 地址字符串
const startIpAddress = intToIp(startIpInt);
const endIpAddress = endIpInt !== null ? intToIp(endIpInt) : null;
return [startIpAddress, endIpAddress];
}
// 将 IP 地址字符串转换为整数
function ipToInt(ip) {
return ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet, 10), 0) >>> 0;
}
// 将整数转换为 IP 地址字符串
function intToIp(intIp) {
return `${intIp >>> 24}.${(intIp >> 16) & 255}.${(intIp >> 8) & 255}.${intIp & 255}`;
}
// 调用时
const [startIpAddress, endIpAddress] = calculateIpRange('192.168.1.0', 20);
功能结合:
【IP地址】输入小数点,自动移到下一输入框