---
title: lua将ip范围转CIDR
date: 2023-03-25 17:54:53
categories: 其它技术
tags:
- lua
- ip范围
- cidr
---
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表示。