golang 大端匹配IP网段

字节序:大端序、小端序

大端序:低地址端存放高位字节
小端序:低地址端存放低位字节
在这里插入图片描述

大端序,网段指定首末ip
import "net"

func main () {
	ip, cidr, _ := net.ParseCIDR("10.1.0.0/16")
	// 10.1.0.0
    fmt.Println(ip)
    
    Prefix := cidr.IP.String()
    // 10.1.0.0
    fmt.Println(Prefix)
    
    m, _ := cidr.Mask.Size() 
    //int 16
    fmt.Println(m)
    
    //将mask转换成ip格式,255.255.0.0
	fmt.Println(net.IP(cidr.Mask).To4()) 
	
	//ffff0000(32bit,f=1111) 转换255.255.0.0 掩码
	fmt.Println(cidr.Mask)
    
	//10.1.0.0 加上100变成10.1.0.100,如果加上300,满255就会向前进位
	first = firstIP(cidr, 100)
	last = lastIP(cidr)

}
func firstIP(cidr net.IP, num int) string {
	//len(cidr.IP.To4())的长度是4
	ip := make(net.IP, len(cidr.IP.To4()))
	
	//10.1.0.0
    fmt.Println(cidr.IP.To4())
    
    // 0.0.0.0
    fmt.Println(ip) 

	//这里只接受cidr.IP.To4()ip类型,转为Uint32类型,| num等于+num,最大保位255,如果超过255,向前进一位变成10.1.1.0
    first:= binary.BigEndian.Uint32(cidr.IP.To4()) | num
   
    // ip初始化时为0.0.0.0,将first的值赋给ip
    binary.BigEndian.PutUint32(ip,first)
    
    return ip.String()
}

func lastIP(cidr net.IP) string {
	//反序,变成ffff 65535 : 0.0.255.255
	last:= ^binary.BigEndian.Uint32(net.IP(cidr.Mask).To4())
	// 将last的值赋给ip,10.1.255.255
    binary.BigEndian.PutUint32(ip,last)  
    }
获取本机IP
import "net"

func GetHostIp() (net.IP, error) {
	addrs, err := net.InterfaceAddrs()
	if err != nil {
		return nil, err
	}
	
	//此时addrs包含ipv4和ipv6的地址
	fmt.Println(addrs)
	
	for _, a := range addrs {
		if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
			if ipnet.IP.To4() != nil {
				return ipnet.IP, nil
			}
		}
	}

	return nil, errors.New("no valid ipv4 address founded")
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值