Golang Net.IP到IPv6(从MySQL)的十进制(39,0)转换?

问题描述 投票:3回答:2

我有一个数据库,它将IPv4和IPv6地址存储为十进制(39,0)。我需要将一个Golang Net.IP转换为这种格式。我已经对IPv4做了如下转换。

func ipv4ToInt(IPv4Addr net.IP) int64 {
    bits := strings.Split(IPv4Addr.String(), ".")

    b0, _ := strconv.Atoi(bits[0])
    b1, _ := strconv.Atoi(bits[1])
    b2, _ := strconv.Atoi(bits[2])
    b3, _ := strconv.Atoi(bits[3])

    var sum int64

    sum += int64(b0) << 24
    sum += int64(b1) << 16
    sum += int64(b2) << 8
    sum += int64(b3)

return sum
}

我正在尝试用IPv6做同样的事情。

func ipv6ToInt(IPv6Addr net.IP) Int128 {
    bits := strings.Split(IPv6Addr.String(), ":")
    var arr [4]int64
    var arr1 [4]uint64

    for i := 0; i < 4; i++ {
        arr[i], _ = strconv.ParseInt(bits[i], 16, 64)

    }

    for i := 0; i < 4; i++ {
    arr1[i], _ = strconv.ParseUint(bits[i], 16, 64)
    }

    int1 := arr[0]

    for i := 0; i < 4; i++ {
        int1 = (int1 << 16) + arr[i]
    }

    int2 := arr1[0]
    for i := 0; i < 4; i++ {
        int2 = (int2 << 16) + arr1[i]
    }

    var IPv6Int Int128
    IPv6Int.H = int1
    IPv6Int.L = int2
    return IPv6Int
}

其中int128是

type Int128 struct {
    H int64
    L uint64
}

结果应该是这样的。

42540578165168461141553663388954918914

来自IPv6地址

2001:470:0:76::2

谢谢!

编辑,答案:感谢#go-nuts里的人,答案如下。

func ipv6ToInt(IPv6Addr net.IP) *big.Int {
    IPv6Int := big.NewInt(0)
    IPv6Int.SetBytes(IPv6Addr)
    return IPv6Int
} 

对IPv6也是一样的,只要先做IP.To4()就可以了。

mysql go ipv6 ipv4
2个回答
2
投票

感谢#go-nuts里的人,答案如下。

func ipv6ToInt(IPv6Addr net.IP) *big.Int {
    IPv6Int := big.NewInt(0)
    IPv6Int.SetBytes(IPv6Addr)
    return IPv6Int
} 

对IPv4也是一样的,只要先做IP.To4()就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.