【Go】IP地址轉換:數字與字串之間高效轉換
轉載:https://blog.thinkeridea.com/201903/go/ip2long.html
IP 地址庫中 IP 地址的儲存格式一般有兩種,一種是點分十進位制形式(192.168.1.1),另一種是數字形式(3232235777),應用中,經常需要在這兩種格式之間做轉換。
針對這一個問題我在 exnet 擴充套件包裡面實現可兩者的轉換的快捷方法:
func IP2Long(ip net.IP) (uint, error)
IP2Long 把 net.IP 轉為數值func Long2IP(i uint) (net.IP, error)
Long2IP 把數值轉為 net.IPfunc IPString2Long(ip string) (uint, error)
IPString2Long 把 ip 字串轉為數值func Long2IPString(i uint) (string, error)
Long2IPString 把數值轉為 ip 字串
使用示例:
package main
import (
"fmt"
"net"
"reflect"
"github.com/thinkeridea/go-extend/exnet"
)
func main() {
ip := "192.168.1.1"
n, _ := exnet.IPString2Long(ip)
s, _ := exnet.Long2IPString(n)
fmt.Println(n, s == ip)
Ip1 := net.ParseIP(ip) // 會得到一個16位元組的byte,主要為了相容ipv6
n, _ = exnet.IP2Long(Ip1)
Ip2, _ := exnet.Long2IP(n)
fmt.Println(n, reflect.DeepEqual(Ip1[12:], Ip2))
}
那麼是如何將點分十進位制的IP地址轉為數字?
IPv4 地址有4個位元組,樣式如下:
MSB————–LSB
b4 b3 b2 b1
每個位元組表示的範圍:
- byte4: 4294967296(1<<32)
- byte3: 16777216(1<<24)
- byte2: 65536(1<<16)
- byte1: 256(1<<8)
通用公式:b4<<24 | b3<<16 | b2<<16 | b1
例如,222.173.108.86
轉換方法:222<<24 | 173<<16 | 108<<8 | 86 = 3735907414
再例如,1.0.1.1
轉換方法:1<<24 | 0<<16 | 1<<8 | 1 = 16777473
exnet 中實現如下:
// IPString2Long 把ip字串轉為數值
func IPString2Long(ip string) (uint, error) {
b := net.ParseIP(ip).To4()
if b == nil {
return 0, errors.New("invalid ipv4 format")
}
return uint(b[3]) | uint(b[2])<<8 | uint(b[1])<<16 | uint(b[0])<<24, nil
}
把數值轉換為字串的邏輯翻轉過來即可, exnet 中實現如下:
// Long2IPString 把數值轉為ip字串
func Long2IPString(i uint) (string, error) {
if i > math.MaxUint32 {
return "", errors.New("beyond the scope of ipv4")
}
ip := make(net.IP, net.IPv4len)
ip[0] = byte(i >> 24)
ip[1] = byte(i >> 16)
ip[2] = byte(i >> 8)
ip[3] = byte(i)
return ip.String(), nil
}
轉載:
本文作者: 戚銀(thinkeridea)
本文連結: https://blog.thinkeridea.com/201903/go/ip2long.html
版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY 4.0 CN協議 許可協議。轉載請註明出處!
相關文章
- java將IP地址轉換為數字以及逆向轉換Java
- JavaScript字串轉換數字JavaScript字串
- mysql時間與字串之間相互轉換MySql字串
- Go 中數字轉換字串的正確姿勢Go字串
- Thymeleaf將字串轉換為數字字串
- c++中字元、字串和數字間的轉換C++字元字串
- golang日期字串與時間戳轉換Golang字串時間戳
- list與字串轉換字串
- string與數字相互轉換
- Java 中 CLOB 和字串之間的轉換Java字串
- c++中數字和字串的轉換C++字串
- 字串轉換整數(atoi)字串
- PTA 7-18 IP地址轉換(JAVA)Java
- mysql 字串和數字比,字串會隱式轉換為數字0MySql字串
- 判斷迴文串 字串/數字相互轉換字串
- python字串轉換為日期時間Python字串
- python str與bytes之間的轉換Python
- 時間戳與時間字串的多時區轉換時間戳字串
- Java之時間轉換Java
- json字串與物件互相轉換JSON字串物件
- JSON字串與HashMap相互轉換JSON字串HashMap
- ARP協議 地址解析協議:IP地址轉換為MAC地址協議Mac
- MSSQL-從字串轉換日期和/或時間時,轉換失敗SQL字串
- 漢字-字母-位元組-位之間的轉換
- php日期時間如何轉換為字串PHP字串
- Java中Array與ArrayList之間的轉換Java
- JavaScript 字串轉換數值型別JavaScript字串型別
- python實現字串轉換整數Python字串
- 淺談Go型別轉換之間的那些事Go型別
- 淺談 Go 型別轉換之間的那些事Go型別
- Go高階特性 15 | 執行時反射:字串和結構體之間轉換Go反射字串結構體
- 字串與數字轉換函式 | 全方位認識 sys 系統庫字串函式
- Octave 數字轉字元,連線兩個字串,以及如何將字串轉換為變數名稱字元字串變數
- 陣列與字串方法與相互轉換陣列字串
- java 字串與檔案相互轉換Java字串
- Day7(字串)|344.反轉字串 541.反轉字串II 54.替換數字字串
- Java Stram實現Map和字串之間互相轉換| BaeldungJava字串
- Golang 陣列和字串之間的相互轉換[]byte/stringGolang陣列字串