diff --git a/binding/golang/xdb/util.go b/binding/golang/xdb/util.go index 49eb20f..7cb4cb9 100644 --- a/binding/golang/xdb/util.go +++ b/binding/golang/xdb/util.go @@ -9,20 +9,21 @@ package xdb import ( - "encoding/binary" "fmt" "os" "strconv" "strings" ) +var shiftIndex = []int{24, 16, 8, 0} + func CheckIP(ip string) (uint32, error) { var ps = strings.Split(ip, ".") if len(ps) != 4 { return 0, fmt.Errorf("invalid ip address `%s`", ip) } - var buff = make([]byte, 4) + var val = uint32(0) for i, s := range ps { d, err := strconv.Atoi(s) if err != nil { @@ -33,20 +34,15 @@ func CheckIP(ip string) (uint32, error) { return 0, fmt.Errorf("the %dth part `%s` should be an integer bettween 0 and 255", i, s) } - buff[i] = byte(d) + val |= uint32(d) << shiftIndex[i] } // convert the ip to integer - return binary.BigEndian.Uint32(buff), nil + return val, nil } func Long2IP(ip uint32) string { - var buff = make([]string, 4) - buff[0] = fmt.Sprintf("%d", (ip>>24)&0xFF) - buff[1] = fmt.Sprintf("%d", (ip>>16)&0xFF) - buff[2] = fmt.Sprintf("%d", (ip>>8)&0xFF) - buff[3] = fmt.Sprintf("%d", (ip>>0)&0xFF) - return strings.Join(buff, ".") + return fmt.Sprintf("%d.%d.%d.%d", (ip>>24)&0xFF, (ip>>16)&0xFF, (ip>>8)&0xFF, ip&0xFF) } func MidIP(sip uint32, eip uint32) uint32 { diff --git a/binding/golang/xdb/util_test.go b/binding/golang/xdb/util_test.go index 18624a1..bea7711 100644 --- a/binding/golang/xdb/util_test.go +++ b/binding/golang/xdb/util_test.go @@ -9,11 +9,41 @@ package xdb import ( + "encoding/binary" "fmt" + "net" "testing" "time" ) +func TestCheckIP(t *testing.T) { + var str = "29.34.191.255" + ip, err := CheckIP(str) + if err != nil { + t.Errorf("check ip `%s`: %s\n", str, err) + } + + netIP := net.ParseIP(str).To4() + if netIP == nil { + t.Fatalf("parse ip `%s` failed", str) + } + + u32 := binary.BigEndian.Uint32(netIP) + fmt.Printf("checkip: %d, parseip: %d, isEqual: %v\n", ip, u32, ip == u32) +} + +func TestLong2IP(t *testing.T) { + var str = "29.34.191.255" + netIP := net.ParseIP(str).To4() + if netIP == nil { + t.Fatalf("parse ip `%s` failed", str) + } + + u32 := binary.BigEndian.Uint32(netIP) + ipStr := Long2IP(u32) + fmt.Printf("originIP: %s, Long2IP: %s, isEqual: %v\n", str, ipStr, ipStr == str) +} + func TestLoadVectorIndex(t *testing.T) { vIndex, err := LoadVectorIndexFromFile("../../../data/ip2region.xdb") if err != nil { diff --git a/maker/golang/xdb/util.go b/maker/golang/xdb/util.go index 45b7427..df01c5b 100644 --- a/maker/golang/xdb/util.go +++ b/maker/golang/xdb/util.go @@ -12,6 +12,8 @@ import ( // Util function +var shiftIndex = []int{24, 16, 8, 0} + func CheckIP(ip string) (uint32, error) { var ps = strings.Split(ip, ".") if len(ps) != 4 { @@ -29,11 +31,9 @@ func CheckIP(ip string) (uint32, error) { return 0, fmt.Errorf("the %dth part `%s` should be an integer bettween 0 and 255", i, s) } - val |= uint32(d) << ((3 - i) * 8) + val |= uint32(d) << shiftIndex[i] } - // convert the ip to integer - return val, nil } diff --git a/maker/golang/xdb/util_test.go b/maker/golang/xdb/util_test.go index d162a12..7e918c1 100644 --- a/maker/golang/xdb/util_test.go +++ b/maker/golang/xdb/util_test.go @@ -17,23 +17,26 @@ func TestCheckIP(t *testing.T) { if err != nil { t.Errorf("check ip `%s`: %s\n", str, err) } - netip := net.ParseIP(str).To4() - if netip == nil { + + netIP := net.ParseIP(str).To4() + if netIP == nil { t.Fatalf("parse ip `%s` failed", str) } - u32 := binary.BigEndian.Uint32(netip) - fmt.Printf("checkip: %d, parseip: %d, isequal: %v", ip, u32, ip == u32) + + u32 := binary.BigEndian.Uint32(netIP) + fmt.Printf("checkip: %d, parseip: %d, isEqual: %v\n", ip, u32, ip == u32) } func TestLong2IP(t *testing.T) { var str = "29.34.191.255" - netip := net.ParseIP(str).To4() - if netip == nil { + netIP := net.ParseIP(str).To4() + if netIP == nil { t.Fatalf("parse ip `%s` failed", str) } - u32 := binary.BigEndian.Uint32(netip) - ipstr := Long2IP(u32) - fmt.Printf("originIP: %s, Long2IP: %s, isequal: %v", str, ipstr, ipstr == str) + + u32 := binary.BigEndian.Uint32(netIP) + ipStr := Long2IP(u32) + fmt.Printf("originIP: %s, Long2IP: %s, isEqual: %v\n", str, ipStr, ipStr == str) } func TestSplitSegment(t *testing.T) {