function generateAvailableHosts(startIP, subnetMask, subnetsCount) {
const ipParts = startIP.split('.').map(Number); // 将起始IP转换为数字数组
const hostGroups = []; // 存储结果的数组
// 计算子网的主机位数和块大小
const maskBits = subnetMask;
const hostBits = 32 - maskBits; // 主机位数
const blockSize = Math.pow(2, hostBits); // 块大小(每个子网的IP数量)
const usableHosts = blockSize - 2; // 可用主机地址数量(去除网络地址和广播地址)
// 生成每个子网的可用主机地址
for (let i = 0; i < subnetsCount; i++) {
// 计算当前子网的网络地址
let networkAddress = ipParts.slice();
networkAddress[3] += i * blockSize;
// 处理可能的进位
for (let j = 3; j > 0; j--) {
if (networkAddress[j] > 255) {
networkAddress[j] -= 256;
networkAddress[j - 1] += 1;
}
}
// 获取当前子网的可用主机地址范围
let usableHostsArray = [];
for (let j = 1; j <= usableHosts; j++) {
let hostIP = networkAddress.slice();
hostIP[3] += j;
// 处理进位
for (let k = 3; k > 0; k--) {
if (hostIP[k] > 255) {
hostIP[k] -= 256;
hostIP[k - 1] += 1;
}
}
usableHostsArray.push(hostIP.join('.'));
}
// 将当前子网的可用主机地址放入结果数组
hostGroups.push(usableHostsArray);
}
return hostGroups;
}
// 使用示例
const startIP = "192.168.0.0";
const subnetMask = 28; // 可以传入不同的子网掩码:27、28、29、30
const subnetsCount = 256 / Math.pow(2, 32 - subnetMask); // 生成多少个子网
const availableHosts = generateAvailableHosts(startIP, subnetMask, subnetsCount);
console.log(availableHosts);