整型转ip
function int2ip(ip_int){
const i = ip_int
const iv = (ip)=>(ip>>>24)
const result = [0,8,16,24]
return result.map(r=>iv(i<<r)).join('.')
}
ip转整型
function ip2int(ip_str) {
const type = Object.prototype.toString.call(ip_str)
if (type !== '[object Array]') {
ip_str = ip_str.split('.')
}
if (ip_str.length !== 4) return 0
ip_str = ip_str.map(i => Number(i))
if (ip_str.find(i => i < 0 || i > 255)) return 0
const t = (prev, cur) => prev * Number(1 << 8) + cur
return ip_str.reduce(t, Number(0))
}
ip掩码匹配示例
const ip = ["1.1.1.1","1.1.1.35","1.1.2.15","1.1.5.1","1.9.2.5"].map(i=>ip2int(i))
const query = '1.1.1.0/24'
function check_same_ip(ip_list, ip_query) {
const ip_base = ip_query.split('/')
if (ip_base.length <= 0 || ip_base.length > 2) return []
const mask = 32 - (ip_base.length == 1 ? 32 : ip_base[1])
const ip = ip2int(ip_base[0]) >> mask
return ip_list.filter(i => i >> mask == ip).map(i=>int2ip(i))
}
console.log(check_same_ip(ip,query))