2 回答
TA贡献1839条经验 获得超15个赞
要将网络一分为二,请将前缀的长度增加一。这给了你下半部分。要计算后半部分,请将网络部分加一(为简洁起见省略了错误处理):
package main
import (
"fmt"
"math/big"
"net/netip"
)
func main() {
p := netip.MustParsePrefix("192.168.0.0/16")
lo, hi := split(p)
fmt.Println(lo, hi) // 192.168.0.0/17 192.168.128.0/17
}
func split(p netip.Prefix) (lo, hi netip.Prefix) {
p = p.Masked()
lo, _ = p.Addr().Prefix(p.Bits() + 1)
delta := big.NewInt(1)
delta.Lsh(delta, uint(lo.Addr().BitLen()-lo.Bits()))
n := new(big.Int).SetBytes(lo.Addr().AsSlice())
n.Add(n, delta)
hiIP, _ := netip.AddrFromSlice(n.Bytes())
hi = netip.PrefixFrom(hiIP, lo.Bits())
return lo, hi
}
https://go.dev/play/p/0HLqUK0RmVC
TA贡献1906条经验 获得超10个赞
“使用默认的net包和github.com/brotherpowers/ipsubnet、github.com/seancfoley/ipaddress-go/ipaddr等包没有得到想要的结果。”
以下是如何使用github.com/seancfoley/ipaddress-go/ipaddr(注意此代码也适用于 IPv6 和前缀长度的任何更改):
package main
import (
"fmt"
"github.com/seancfoley/ipaddress-go/ipaddr"
)
func main() {
cidr := ipaddr.NewIPAddressString("192.168.0.0/16").GetAddress()
for i := cidr.AdjustPrefixLen(1).PrefixBlockIterator(); i.HasNext(); {
fmt.Println(i.Next())
}
}
输出:
192.168.0.0/17
192.168.128.0/17
- 2 回答
- 0 关注
- 126 浏览
添加回答
举报
