function iptocidr(ip, mask) local function decimal_to_binary(decimal) local binary = "" for i = 7, 0, -1 do binary = binary .. ((decimal % 2^i) - decimal % 2^(i-1) > 0 and "1" or "0") end return binary end local function cidr_to_mask(cidr) return (2^cidr - 1) * 2^(32 - cidr) end local function ip_to_decimal(ip) local decimal = 0 for octet in string.gmatch(ip, "%d+") do decimal = decimal * 256 + tonumber(octet) end return decimal end local ip_decimal = ip_to_decimal(ip) local mask_decimal = cidr_to_mask(mask) local net_decimal = bit.band(ip_decimal, mask_decimal) local cidr = 0 while mask_decimal > 0 do cidr = cidr + 1 mask_decimal = bit.lshift(mask_decimal, 1) % 2^32 end return string.format("%s/%d", ip, cidr) end function iprangetocidr(ip_start, ip_end) local cidrs = {} local ip_start_decimal = iptodecimal(ip_start) local ip_end_decimal = iptodecimal(ip_end) while ip_start_decimal <= ip_end_decimal do local max_size = 32 while max_size > 0 do local mask = max_size - 1 local sub_mask = 2^mask local net_start = bit.band(ip_start_decimal, bit.bnot(sub_mask - 1)) if net_start ~= ip_start_decimal or bit.band(ip_end_decimal, sub_mask - 1) ~= sub_mask - 1 then break end max_size = max_size - mask end table.insert(cidrs, iptocidr(iptodotted(ip_start_decimal), max_size)) ip_start_decimal = ip_start_decimal + 2^(32 - max_size) end return cidrs end -- 测试代码 local cidrs = iprangetocidr("192.168.1.0", "192.168.1.255") for _, cidr in ipairs(cidrs) do print(cidr) end
该代码定义了两个函数:
iptocidr
函数将单个IP地址和掩码转换为CIDR表示。它使用位运算和字符串格式化来实现这一点。iprangetocidr
函数将IP地址范围转换为CIDR表示。它将IP地址范围分成一系列子网,每个子网都具有相同的前缀和掩码。它使用iptocidr
函数来转换每个子网,并将结果添加到一个数组中。最后,它返回该数组。
测试代码将IP地址范围192.168.1.0
到192.168.1.255
转换为CIDR表示,并打印每个子网的CIDR表示。