3

タイトルですみません、私はそれを言う方法がわかりません

このコードについて質問があります

func ip2long(ip string) (ret int64) {
  p:= strings.Split(ip, ".")
  n, _:= strconv.Atoi(p[0])
  ret += int64(n)*16777216 
  n, _= strconv.Atoi(p[1])
  ret += int64(n)*65536 
  n, _= strconv.Atoi(p[2])
  ret += int64(n)*256
  n, _= strconv.Atoi(p[3])
  ret += int64(n)

  return 
}

IPアドレスを整数に変換したい

あなたは私がそのような醜いコードを書いたことを知っています

最初に strconv.Atoi から数値を取得し、次に int64 に変換します

これを簡単にする方法は?

4

3 に答える 3

7

文字列から複数の整数を解析したい場合は、次のように Sscanf 関数を試してください。

func main() {
    var ip [4] uint32
    addr := "192.168.0.1"
    _, err := fmt.Sscanf(addr, "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3])
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(ip)
    fmt.Println(ip[0]<<24 + ip[1]<<16 + ip[2]<<8 + ip[3])
}
于 2012-06-09T18:02:07.050 に答える
6

この構文は重いですが、構文解析エラーをキャッチしていれば、より自然に見えます。

そうは言っても、その正確な問題に対する正しい解決策 は、 IPnet.ParseIPを構築する既存の関数を使用することです

func ParseIP(s string) IP

現在の関数プロトタイプを保持する必要がある場合は、次のことをお勧めします。

func ip2long(s string) (ret int64) {
    bip := ([]byte)(net.ParseIP(s).To4())
    return (int64)(bip[0]) * (1 << 24) + (int64)(bip[1]) * (1 << 16) + (int64)(bip[2]) * (1 << 8) + (int64)(bip[3])
}

ParseIP が返されたときにテストを追加できることに注意してください (エラーの場合は nil です)。

于 2012-06-09T14:50:48.397 に答える