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 网段范围。

  • parseIPv4RangeparseIPv6Range 函数使用 net.ParseCIDR 函数解析 CIDR 字符串并返回 net.IPNet 结构体。
  • lastIPv4lastIPv6 函数接受 net.IPNet 结构体作为输入,并计算该网段的最后一个 IP 地址。

通过运行这段代码,您可以获得 '192.168.1.0/24' 和 '1080::8:800:200C:417A/64' 的完整网段范围。

Golang 计算 IPv4 和 IPv6 网段范围

原文地址: https://www.cveoy.top/t/topic/fSYt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录