2 回答
TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
要將網(wǎng)絡(luò)一分為二,請(qǐng)將前綴的長(zhǎng)度增加一。這給了你下半部分。要計(jì)算后半部分,請(qǐng)將網(wǎng)絡(luò)部分加一(為簡(jiǎn)潔起見(jiàn)省略了錯(cuò)誤處理):
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貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
“使用默認(rèn)的net包和github.com/brotherpowers/ipsubnet、github.com/seancfoley/ipaddress-go/ipaddr等包沒(méi)有得到想要的結(jié)果?!?/em>
以下是如何使用github.com/seancfoley/ipaddress-go/ipaddr(注意此代碼也適用于 IPv6 和前綴長(zhǎng)度的任何更改):
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 關(guān)注
- 111 瀏覽
添加回答
舉報(bào)
