go-common/app/interface/main/report-click/service/ip.go
2019-04-22 18:49:16 +08:00

138 lines
2.7 KiB
Go

package service
import (
"fmt"
"math"
"net"
)
const sixtyTwo uint64 = 62
func encode(num uint64) string {
var numStr string
for num != 0 {
r := num % sixtyTwo
if r <= 9 {
numStr = string(byte(r)+48) + numStr
} else if r <= 35 {
numStr = string(byte(r)+87) + numStr
} else {
numStr = string(byte(r)+29) + numStr
}
num = num / sixtyTwo
}
return numStr
}
func decode(bs []byte) uint64 {
f := 0.0
l := len(bs) - 1
for _, v := range bs {
if v >= 97 {
v -= 87
} else if v >= 65 {
v -= 29
} else {
v -= 48
}
f = f + float64(v)*math.Pow(float64(sixtyTwo), float64(l))
l = l - 1
}
return uint64(f)
}
// ntoIPv6 conver uint32 to ip addr.
func ntoIPv6(sip []string) string {
if len(sip) != 3 {
return ""
}
ip := make(net.IP, net.IPv6len)
sum := decode([]byte(sip[0]))
ip[0] = byte((sum >> 40) & 0xFF)
ip[1] = byte((sum >> 32) & 0xFF)
ip[2] = byte((sum >> 24) & 0xFF)
ip[3] = byte((sum >> 16) & 0xFF)
ip[4] = byte((sum >> 8) & 0xFF)
ip[5] = byte(sum & 0xFF)
sum = decode([]byte(sip[1]))
ip[6] = byte((sum >> 40) & 0xFF)
ip[7] = byte((sum >> 32) & 0xFF)
ip[8] = byte((sum >> 24) & 0xFF)
ip[9] = byte((sum >> 16) & 0xFF)
ip[10] = byte((sum >> 8) & 0xFF)
ip[11] = byte(sum & 0xFF)
sum = decode([]byte(sip[2]))
ip[12] = byte((sum >> 24) & 0xFF)
ip[13] = byte((sum >> 16) & 0xFF)
ip[14] = byte((sum >> 8) & 0xFF)
ip[15] = byte(sum & 0xFF)
return ip.String()
}
// ipv6AtoN conver ip addr to uint32.
func ipv6AtoN(ip net.IP) (sip string) {
ip = ip.To16()
if ip == nil {
return
}
sum := uint64(ip[0]) << 40
sum += uint64(ip[1]) << 32
sum += uint64(ip[2]) << 24
sum += uint64(ip[3]) << 16
sum += uint64(ip[4]) << 8
sum += uint64(ip[5])
sip = encode(sum)
sum = uint64(ip[6]) << 40
sum += uint64(ip[7]) << 32
sum += uint64(ip[8]) << 24
sum += uint64(ip[9]) << 16
sum += uint64(ip[10]) << 8
sum += uint64(ip[11])
sip = sip + ":" + encode(sum)
sum = uint64(ip[12]) << 24
sum += uint64(ip[13]) << 16
sum += uint64(ip[14]) << 8
sum += uint64(ip[15])
sip = sip + ":" + encode(sum)
fmt.Println(sip, "len:", len(sip))
return
}
// netAtoN conver ipv4 addr to uint32.
func netAtoN(ip net.IP) (sum uint32) {
ip = ip.To4()
if ip == nil {
return
}
sum += uint32(ip[0]) << 24
sum += uint32(ip[1]) << 16
sum += uint32(ip[2]) << 8
sum += uint32(ip[3])
return sum
}
// netNtoA conver uint32 to ipv4 addr.
func netNtoA(sum uint32) string {
ip := make(net.IP, net.IPv4len)
ip[0] = byte((sum >> 24) & 0xFF)
ip[1] = byte((sum >> 16) & 0xFF)
ip[2] = byte((sum >> 8) & 0xFF)
ip[3] = byte(sum & 0xFF)
return ip.String()
}
func parseIP(s string) (net.IP, bool) {
for i := 0; i < len(s); i++ {
switch s[i] {
case '.':
return net.ParseIP(s), true
case ':':
return net.ParseIP(s), false
}
}
return nil, false
}