Java或JS中如何简便快速遍历指定区间内的所有IP地址
遍历IP范围的实现方案
核心思路
IPv4本质是32位无符号整数,最简单高效的遍历方式是先把起止IP转换为整数,直接按整数范围循环遍历,再把整数转回IPv4字符串即可,不需要处理四段分段的边界判断,逻辑简洁性能也高。
你给出的示例IP段104.200.16.0转整数为175636480,104.200.31.255转整数为175638527,直接循环2048次就能遍历完所有IP。
Java实现
public class IpIterator { // IPv4转32位整数 public static long ipToLong(String ipStr) { String[] parts = ipStr.split("\\."); return (Long.parseLong(parts[0]) << 24) | (Long.parseLong(parts[1]) << 16) | (Long.parseLong(parts[2]) << 8) | Long.parseLong(parts[3]); } // 32位整数转IPv4 public static String longToIp(long ipLong) { return (ipLong >> 24 & 0xFF) + "." + (ipLong >> 16 & 0xFF) + "." + (ipLong >> 8 & 0xFF) + "." + (ipLong & 0xFF); } public static void main(String[] args) { String startIp = "104.200.16.0"; String endIp = "104.200.31.255"; long start = ipToLong(startIp); long end = ipToLong(endIp); for (long i = start; i <= end; i++) { String currentIp = longToIp(i); // 此处添加当前IP的业务处理逻辑 System.out.println(currentIp); } } }
如果需要兼容非法输入,自行添加参数校验即可,比如判断拆分后的IP段是否为4段、每段数值是否在0-255范围内。
JavaScript实现
// IPv4转整数 function ipToLong(ipStr) { return ipStr.split('.').reduce((acc, part) => (acc << 8) + parseInt(part, 10), 0) >>> 0; } // 整数转IPv4 function longToIp(ipLong) { return [ (ipLong >>> 24) & 0xFF, (ipLong >>> 16) & 0xFF, (ipLong >>> 8) & 0xFF, ipLong & 0xFF ].join('.'); } // 遍历逻辑 const startIp = '104.200.16.0'; const endIp = '104.200.31.255'; const start = ipToLong(startIp); const end = ipToLong(endIp); for (let i = start; i <= end; i++) { const currentIp = longToIp(i); // 此处添加当前IP的业务处理逻辑 console.log(currentIp); }
代码中>>> 0是为了保证输出无符号整数,避免IP高位为1时出现负数异常。
内容的提问来源于stack exchange,提问作者Internet Person 2
相关产品推荐
相关产品推荐

