根据ip及子网掩码得出网段

function calculateIPRange(ip, subnetMask) {
    // 将IP地址和子网掩码转换为二进制形式
    const ipBinary = ip.split('.').map(part => parseInt(part, 10).toString(2).padStart(8, '0')).join('');
    const subnetBinary = subnetMask.split('.').map(part => parseInt(part, 10).toString(2).padStart(8, '0')).join('');

    // 对IP地址和子网掩码进行按位逻辑与操作
    const networkBinary = ipBinary.split('').map((bit, index) => (bit === '1' && subnetBinary[index] === '1') ? '1' : '0').join('');

    // 将逻辑与运算后的结果转换回十进制形式,得到IP网段的起始地址
    const networkAddress = networkBinary.match(/.{8}/g).map(byte => parseInt(byte, 2)).join('.');

    // 计算子网掩码中连续的1的个数,得到网络前缀长度
    const prefixLength = subnetBinary.indexOf('0');

    // 计算IP网段的结束地址
    const hostBits = 32 - prefixLength;
    const endAddress = networkAddress.split('.').map(part => parseInt(part, 10)).reduce((result, octet, index) => {
        if (index === 3) {
            result.push(octet + Math.pow(2, hostBits) - 1);
        } else {
            result.push(octet);
        }
        return result;
    }, []).join('.');

    // 返回IP网段表示法
    return `${networkAddress}/${prefixLength} - ${endAddress}/${prefixLength}`;
    // return `${networkAddress}/${prefixLength}`;
}

// 示例用法
const ipRange = calculateIPRange('192.168.1.100', '255.255.255.0');
console.log(ipRange); // 输出:192.168.1.0/24 - 192.168.1.255/24

你可能感兴趣的:(vue,tcp/ip,前端,javascript)