【go】IP相关工具类

本文介绍了如何使用Go语言实现IPv4/IPv6地址的识别、CIDR格式IP地址所包含的IP数量计算以及两个IP区间之间的IP数量计算,涉及`net.ParseIP`、`net.ParseCIDR`和`ipToInt`等函数应用。
摘要由CSDN通过智能技术生成

1.判断ipv4 or ipv6

// return int 0:错误的ip 4:ipv4 6:ipv6
func CheckIp(ip string) int {
	if ip == "" {
		return 4
	}
	out := net.ParseIP(ip)
	if out == nil {
		return 0
	}
	if strings.Contains(out.String(), ".") {
		return 4
	}
	if strings.Contains(out.String(), ":") {
		return 6
	}
	return 0
}

2.计算cidr格式ip所含IP个数

func CountIPs(cidr string) (int64, error) {
	_, ipNet, err := net.ParseCIDR(cidr)
	if err != nil {
		return 0, err
	}
	mask := ipNet.Mask
	ones, bits := mask.Size()
	numIPs := int64(1 << uint(bits-ones))
	//fmt.Printf("CIDR IP: %s\n", ipNet)
	//fmt.Printf("子网掩码: %s\n", mask.String())
	//fmt.Printf("IP个数: %d\n", numIPs)

	return numIPs, err
}

3.计算两个ip区间所含ip个数

func ipToInt(ip net.IP) int64 {
	ip = ip.To4()
	if ip == nil {
		return 0
	}
	ipParts := strings.Split(ip.String(), ".")
	ipInt := int64(0)
	for i := 0; i < 4; i++ {
		part, _ := strconv.ParseInt(ipParts[i], 10, 64)
		ipInt += part << ((3 - uint(i)) * 8)
	}
	return ipInt
}

func main() {
	startIP := "183.62.142.241"
	endIP := "183.62.145.233"

	// ip格式校验
	start := net.ParseIP(startIP)
	if start == nil {
		log.Fatal("Invalid start IP address")
	}

	end := net.ParseIP(endIP)
	if end == nil {
		log.Fatal("Invalid end IP address")
	}

	startInt := ipToInt(start)
	endInt := ipToInt(end)
	count := endInt - startInt + 1

	fmt.Printf("Number of IPs between %s and %s: %d\n", startIP, endIP, count)
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微雨停了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值