Golang 计算 IPv4 和 IPv6 网段范围
package main
import (
'fmt'
'net'
)
func main() {
ipv4Range := '192.168.1.0/24'
ipv6Range := '1080::8:800:200C:417A/64'
ipv4Net, err := parseIPv4Range(ipv4Range)
if err != nil {
fmt.Println('Invalid IPv4 range:', err)
return
}
ipv6Net, err := parseIPv6Range(ipv6Range)
if err != nil {
fmt.Println('Invalid IPv6 range:', err)
return
}
fmt.Println('IPv4 Range:', ipv4Net.IP, '-', lastIPv4(ipv4Net))
fmt.Println('IPv6 Range:', ipv6Net.IP, '-', lastIPv6(ipv6Net))
}
func parseIPv4Range(ipv4Range string) (*net.IPNet, error) {
_, ipv4Net, err := net.ParseCIDR(ipv4Range)
if err != nil {
return nil, err
}
return ipv4Net, nil
}
func parseIPv6Range(ipv6Range string) (*net.IPNet, error) {
_, ipv6Net, err := net.ParseCIDR(ipv6Range)
if err != nil {
return nil, err
}
return ipv6Net, nil
}
func lastIPv4(ipNet *net.IPNet) net.IP {
ip := ipNet.IP.To4()
lastIP := make(net.IP, len(ip))
copy(lastIP, ip)
for i := range ip {
lastIP[i] |= ^ipNet.Mask[i]
}
return lastIP
}
func lastIPv6(ipNet *net.IPNet) net.IP {
ip := ipNet.IP.To16()
lastIP := make(net.IP, len(ip))
copy(lastIP, ip)
for i := range ip {
lastIP[i] |= ^ipNet.Mask[i]
}
return lastIP
}
这段 Golang 代码演示了如何计算给定 CIDR 表示法的 IPv4 和 IPv6 网段范围。
parseIPv4Range和parseIPv6Range函数使用net.ParseCIDR函数解析 CIDR 字符串并返回net.IPNet结构体。lastIPv4和lastIPv6函数接受net.IPNet结构体作为输入,并计算该网段的最后一个 IP 地址。
通过运行这段代码,您可以获得 '192.168.1.0/24' 和 '1080::8:800:200C:417A/64' 的完整网段范围。
原文地址: https://www.cveoy.top/t/topic/fSYt 著作权归作者所有。请勿转载和采集!