亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go - 計算低于提供的 cidr 一位的 cidr

Go - 計算低于提供的 cidr 一位的 cidr

Go
智慧大石 2023-01-03 11:19:08
問你如何計算提供的cidr低于一位的cidr?鑒于:網絡 CIDR : (192.168.0.0/16)想要的結果192.168.0.0/17, 192.168.128.0/17使用默認net包和等包github.com/brotherpowers/ipsubnet,github.com/seancfoley/ipaddress-go/ipaddr沒有得到想要的結果。
查看完整描述

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


查看完整回答
反對 回復 2023-01-03
?
隔江千里

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


查看完整回答
反對 回復 2023-01-03
  • 2 回答
  • 0 關注
  • 94 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號