是否有扩展 ipv6 地址的内置功能?
Is there an inbuilt function to expand ipv6 addresses?
我正在做一个需要扩展 IPv6 地址的项目。 Go 有内置函数吗?
我目前正在做的是
ipv6 := "fe80:01::af0"
addr := net.ParseIP(ipv6)
fmt.Println(addr.String())
但这仍然打印
fe80:01::af0
我真正需要的是
fe80:0001:0000:0000:0000:0000:0000:0af0
标准库中没有执行此操作的任何内容,但编写您自己的函数很容易。一种可能的方法(很多):
func FullIPv6(ip net.IP) string {
dst := make([]byte, hex.EncodedLen(len(ip)))
_ = hex.Encode(dst, ip)
return string(dst[0:4]) + ":" +
string(dst[4:8]) + ":" +
string(dst[8:12]) + ":" +
string(dst[12:16]) + ":" +
string(dst[16:20]) + ":" +
string(dst[20:24]) + ":" +
string(dst[24:28]) + ":" +
string(dst[28:])
}
package main
import (
"errors"
"fmt"
"net"
)
func expandIPv6Addr(s string) (string, error) {
addr := net.ParseIP(s).To16()
if addr == nil {
return "", ErrInvalidAddress
}
var hex [16 * 3]byte
for i := 0; i < len(addr); i++ {
if i > 0 {
hex[3*i-1] = ':'
}
hex[3*i] = nibbleToChar(addr[i] >> 4)
hex[3*i+1] = nibbleToChar(addr[i])
}
return string(hex[:]), nil
}
func nibbleToChar(b byte) byte {
b &= 0x0f
if b > 9 {
return ('a' - 10) + b
}
return '0' + b
}
var ErrInvalidAddress = errors.New("invalid address")
func main() {
ipv6 := "fe80:01::af0"
fmt.Println(ipv6)
fmt.Println(expandIPv6Addr(ipv6))
}
IPAddress Go library 一行代码就可以搞定。免责声明:我是项目经理。
fmt.Print(ipaddr.NewIPAddressString("fe80:01::af0").GetAddress().ToFullString())
输出:
fe80:0001:0000:0000:0000:0000:0000:0af0
我正在做一个需要扩展 IPv6 地址的项目。 Go 有内置函数吗?
我目前正在做的是
ipv6 := "fe80:01::af0"
addr := net.ParseIP(ipv6)
fmt.Println(addr.String())
但这仍然打印
fe80:01::af0
我真正需要的是
fe80:0001:0000:0000:0000:0000:0000:0af0
标准库中没有执行此操作的任何内容,但编写您自己的函数很容易。一种可能的方法(很多):
func FullIPv6(ip net.IP) string {
dst := make([]byte, hex.EncodedLen(len(ip)))
_ = hex.Encode(dst, ip)
return string(dst[0:4]) + ":" +
string(dst[4:8]) + ":" +
string(dst[8:12]) + ":" +
string(dst[12:16]) + ":" +
string(dst[16:20]) + ":" +
string(dst[20:24]) + ":" +
string(dst[24:28]) + ":" +
string(dst[28:])
}
package main
import (
"errors"
"fmt"
"net"
)
func expandIPv6Addr(s string) (string, error) {
addr := net.ParseIP(s).To16()
if addr == nil {
return "", ErrInvalidAddress
}
var hex [16 * 3]byte
for i := 0; i < len(addr); i++ {
if i > 0 {
hex[3*i-1] = ':'
}
hex[3*i] = nibbleToChar(addr[i] >> 4)
hex[3*i+1] = nibbleToChar(addr[i])
}
return string(hex[:]), nil
}
func nibbleToChar(b byte) byte {
b &= 0x0f
if b > 9 {
return ('a' - 10) + b
}
return '0' + b
}
var ErrInvalidAddress = errors.New("invalid address")
func main() {
ipv6 := "fe80:01::af0"
fmt.Println(ipv6)
fmt.Println(expandIPv6Addr(ipv6))
}
IPAddress Go library 一行代码就可以搞定。免责声明:我是项目经理。
fmt.Print(ipaddr.NewIPAddressString("fe80:01::af0").GetAddress().ToFullString())
输出:
fe80:0001:0000:0000:0000:0000:0000:0af0