2014-04-25 7 views
2

저는 IPv4와 IPv6 주소를 십진수 (39,0)로 저장하는 데이터베이스를 가지고 있습니다. Golang Net.IP를이 형식으로 변환해야합니다.Golang Net.IP에서 IPv6 (MySQL에서)을 십진수 (39,0)로 변환 하시겠습니까?

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를 가진 동일한을 시도하고있다 :

: int128는

type Int128 struct { 
    H int64 
    L uint64 
} 

결과는 같아야을

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 
} 

입니다

경우를 다음과 같이 나는 IPv4를 위해 일을했다
42540578165168461141553663388954918914 

from IPv6 주소 :

2001:470:0:76::2 

고마워요!

편집, 답변 : 이동 너트 #이 대답은 다음과 같다의 사람들에게 감사 : IPv6에 대한

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

같은 작품, 단지 IP.To4을() 첫째. 이동 너트 #이 대답은 다음과 같다의 사람들에게

+2

답변으로 추가하고 표시해야합니다. – OneOfOne

답변

1

감사 : IPv4의

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

같은 작품, 그냥 IP.To4을() 첫째.