lua将ip范围转CIDR

  • A+
所属分类:其它技术
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.0192.168.1.255转换为CIDR表示,并打印每个子网的CIDR表示。

ZPY

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: