我需要在哪里开始生成IP地址 给定一个CIDR和一些缓存的地址。 我在这里做字节的一些代码。与存储 地址,仅选择更大的地址。
https://play.golang.org/p/yT_Mj4fR_jK
这是怎么回事?基本上我需要所有地址 来自“ 62.76.47.12/28”中的“ 62.76.47.9”。生成IP 在给定的CIDR范围内是众所周知的。
谢谢。
答案 0 :(得分:0)
如果打印ìpMax
,您将看到其基础表示使用16个字节。 (另请参见docs
fmt.Printf("'%#v'\n",ipMax)
'net.IP{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x3e, 0x4c, 0x2f, 0x9}'
您可以将ipMax
转换为IPv4表示形式以获得所需的结果:
ipMax := net.ParseIP("62.76.47.9").To4()
答案 1 :(得分:0)
此示例将打印从第一个地址62.76.47.12/28到62.76.47.9的地址。
游乐场:https://play.golang.org/p/MUtbiKaQ_3-
package main
import (
"fmt"
"net"
)
func main() {
cidr := "62.76.47.12/28"
_, ipnet, _ := net.ParseCIDR(cidr)
ipFirst := ipnet.IP
ipFirstValue := toHost(ipFirst)
ipLast := net.ParseIP("62.76.47.9")
ipLastValue := toHost(ipLast)
fmt.Println("cidr: ", cidr)
fmt.Println("first: ", ipFirst)
fmt.Println("last: ", ipLast)
if ipLastValue < ipFirstValue {
fmt.Println("ugh")
return
}
for i := ipFirstValue; i < ipLastValue; i++ {
addr := toIP(i)
fmt.Println(addr)
}
}
func toHost(ip net.IP) uint32 {
i := ip.To4()
return uint32(i[0])<<24 + uint32(i[1])<<16 + uint32(i[2])<<8 + uint32(i[3])
}
func toIP(v uint32) net.IP {
v3 := byte(v & 0xFF)
v2 := byte((v >> 8) & 0xFF)
v1 := byte((v >> 16) & 0xFF)
v0 := byte((v >> 24) & 0xFF)
return net.IPv4(v0, v1, v2, v3)
}