网络工具函数
2024年9月9日大约 1 分钟
根据 IP 地址和子网掩码计算 IP 地址范围
计算 IP 地址范围
/**
* 计算IP地址范围
*
* @param ip IP地址
* @param subnetMask 子网掩码
* @returns 返回IP地址范围的起始和结束地址
*/
function calculateIpRange(ip: string, subnetMask: string): string[] {
const ipLong = ipToLong(ip);
const maskLong = ipToLong(subnetMask);
// 计算网络地址
const networkAddress = ipLong & maskLong;
// 计算广播地址
// 首先将子网掩码取反(得到反向掩码),然后与IP地址进行按位或操作
const broadcastAddress = ipLong | ~maskLong;
// 转换回点分十进制
const startIp = longToIp(networkAddress);
const endIp = longToIp(broadcastAddress);
return getAllIpsInRange(startIp, endIp);
}
获取 IP 地址范围内的所有 IP 地址
/**
* 获取IP地址范围内的所有IP地址
*
* @param startIp 起始IP地址
* @param endIp 结束IP地址
* @returns 包含起始到结束范围内所有IP地址的数组
*/
function getAllIpsInRange(startIp: string, endIp: string): string[] {
let start = ipToLong(startIp);
let end = ipToLong(endIp);
let ips: string[] = [];
for (let ip = start; ip <= end; ip++) {
ips.push(longToIp(ip));
}
return ips;
}
将 IP 地址转换为长整型数字
/**
* 将IP地址转换为长整型数字
*
* @param ip IP地址字符串,格式为xxx.xxx.xxx.xxx
* @returns 转换后的长整型数字
*/
function ipToLong(ip: string): number {
let parts = ip.split(".");
return (
(parseInt(parts[0], 10) << 24) |
(parseInt(parts[1], 10) << 16) |
(parseInt(parts[2], 10) << 8) |
parseInt(parts[3], 10)
);
}
将长整型 IP 地址转换为字符串形式的 IP 地址
/**
* 将长整型IP地址转换为字符串形式的IP地址
*
* @param ipLong 长整型IP地址
* @returns 字符串形式的IP地址
*/
function longToIp(ipLong: number): string {
return [
(ipLong >>> 24).toString(10),
((ipLong >> 16) & 0xff).toString(10),
((ipLong >> 8) & 0xff).toString(10),
(ipLong & 0xff).toString(10),
].join(".");
}