From 3e16c95951f4c979f4c642349bbdd4cee60028b7 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Thu, 19 Aug 2021 10:50:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0configutils/ParseCIDR()?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/configutils/ip.go | 22 ++++++++++++++++++++++ pkg/configutils/ip_test.go | 11 +++++++++++ 2 files changed, 33 insertions(+) create mode 100644 pkg/configutils/ip_test.go diff --git a/pkg/configutils/ip.go b/pkg/configutils/ip.go index 32a89f3..de9f469 100644 --- a/pkg/configutils/ip.go +++ b/pkg/configutils/ip.go @@ -25,6 +25,28 @@ func IP2Long(ip string) uint64 { return uint64(binary.BigEndian.Uint32(s.To4())) } +// ParseCIDR 计算CIDR最大值 +func ParseCIDR(cidr string) (ipFrom string, ipTo string, err error) { + _, ipNet, err := net.ParseCIDR(cidr) + if err != nil { + return "", "", err + } + ipFrom = ipNet.IP.String() +Loop: + for i := len(ipNet.Mask) - 1; i >= 0; i-- { + for j := 7; j >= 0; j-- { + var m = ipNet.Mask[i] >> (7 - j) & 1 // 读取某位bit + if m == 0 { + ipNet.IP[i] |= 1 << j // 将此位置为1 + } else { + break Loop + } + } + } + ipTo = ipNet.IP.String() + return +} + // QuoteIP 为IPv6加上括号 func QuoteIP(ip string) string { if len(ip) == 0 { diff --git a/pkg/configutils/ip_test.go b/pkg/configutils/ip_test.go new file mode 100644 index 0000000..c53c082 --- /dev/null +++ b/pkg/configutils/ip_test.go @@ -0,0 +1,11 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package configutils + +import "testing" + +func TestParseCIDR(t *testing.T) { + t.Log(ParseCIDR("192.168.1.1/32")) + t.Log(ParseCIDR("192.168.1.1/24")) + t.Log(ParseCIDR("192.168.1.1/16")) +}