feat(net/gipv4): add enhanced the conversion between uint32 and string (#3988)

This commit is contained in:
oldme
2024-12-01 10:16:03 +08:00
committed by GitHub
parent e572ed01b3
commit 9923975b1c
3 changed files with 114 additions and 18 deletions

View File

@ -6,33 +6,16 @@
//
// Package gipv4 provides useful API for IPv4 address handling.
package gipv4
import (
"encoding/binary"
"fmt"
"net"
"strconv"
"github.com/gogf/gf/v2/text/gregex"
)
// Ip2long converts ip address to an uint32 integer.
func Ip2long(ip string) uint32 {
netIp := net.ParseIP(ip)
if netIp == nil {
return 0
}
return binary.BigEndian.Uint32(netIp.To4())
}
// Long2ip converts an uint32 integer ip address to its string type address.
func Long2ip(long uint32) string {
ipByte := make([]byte, 4)
binary.BigEndian.PutUint32(ipByte, long)
return net.IP(ipByte).String()
}
// Validate checks whether given `ip` a valid IPv4 address.
func Validate(ip string) bool {
return gregex.IsMatchString(`^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$`, ip)

View File

@ -0,0 +1,59 @@
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
//
// Package gipv4 provides useful API for IPv4 address handling.
package gipv4
import (
"encoding/binary"
"net"
)
// IpToLongBigEndian converts ip address to an uint32 integer with big endian.
func IpToLongBigEndian(ip string) uint32 {
netIp := net.ParseIP(ip)
if netIp == nil {
return 0
}
return binary.BigEndian.Uint32(netIp.To4())
}
// LongToIpBigEndian converts an uint32 integer ip address to its string type address with big endian.
func LongToIpBigEndian(long uint32) string {
ipByte := make([]byte, 4)
binary.BigEndian.PutUint32(ipByte, long)
return net.IP(ipByte).String()
}
// IpToLongLittleEndian converts ip address to an uint32 integer with little endian.
func IpToLongLittleEndian(ip string) uint32 {
netIp := net.ParseIP(ip)
if netIp == nil {
return 0
}
return binary.LittleEndian.Uint32(netIp.To4())
}
// LongToIpLittleEndian converts an uint32 integer ip address to its string type address with little endian.
func LongToIpLittleEndian(long uint32) string {
ipByte := make([]byte, 4)
binary.LittleEndian.PutUint32(ipByte, long)
return net.IP(ipByte).String()
}
// Ip2long converts ip address to an uint32 integer.
// Deprecated: Use IpToLongBigEndian instead.
func Ip2long(ip string) uint32 {
return IpToLongBigEndian(ip)
}
// Long2ip converts an uint32 integer ip address to its string type address.
// Deprecated: Use LongToIpBigEndian instead.
func Long2ip(long uint32) string {
return LongToIpBigEndian(long)
}

View File

@ -0,0 +1,54 @@
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
package gipv4_test
import (
"testing"
"github.com/gogf/gf/v2/net/gipv4"
"github.com/gogf/gf/v2/test/gtest"
)
const (
ipv4 string = "192.168.1.1"
longBigEndian uint32 = 3232235777
longLittleEndian uint32 = 16885952
)
func TestIpToLongBigEndian(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var u = gipv4.IpToLongBigEndian(ipv4)
t.Assert(u, longBigEndian)
var u2 = gipv4.Ip2long(ipv4)
t.Assert(u2, longBigEndian)
})
}
func TestLongToIpBigEndian(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var s = gipv4.LongToIpBigEndian(longBigEndian)
t.Assert(s, ipv4)
var s2 = gipv4.Long2ip(longBigEndian)
t.Assert(s2, ipv4)
})
}
func TestIpToLongLittleEndian(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var u = gipv4.IpToLongLittleEndian(ipv4)
t.Assert(u, longLittleEndian)
})
}
func TestLongToIpLittleEndian(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var s = gipv4.LongToIpLittleEndian(longLittleEndian)
t.Assert(s, ipv4)
})
}