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等包沒有得到想要的結果?!?/em>
以下是如何使用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 關注
- 94 瀏覽
添加回答
舉報