Go 是否有用于扩展ipv6地址的内置函数?
我正在做一个需要扩展IPv6地址的项目。Go中是否有内置功能 我现在正在做的是Go 是否有用于扩展ipv6地址的内置函数?,go,networking,ipv6,Go,Networking,Ipv6,我正在做一个需要扩展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 标准库中没有这样做的功能,但是编写自己的函数很容易。一种(多种)可能的方法: 标准库中没有任何功能可以实现这一点,但编写自己的函
ipv6 := "fe80:01::af0"
addr := net.ParseIP(ipv6)
fmt.Println(addr.String())
但这还印着
fe80:01::af0
我真正需要的是
fe80:0001:0000:0000:0000:0000:0000:0af0
标准库中没有这样做的功能,但是编写自己的函数很容易。一种(多种)可能的方法:
标准库中没有任何功能可以实现这一点,但编写自己的函数很容易。一种(多种)可能的方法:
主包装
进口(
“错误”
“fmt”
“净额”
)
func expandIPv6Addr(s字符串)(字符串,错误){
addr:=net.ParseIP.To16()
如果addr==nil{
返回“”,ErrInvalidAddress
}
var十六进制[16*3]字节
对于i:=0;i0{
十六进制[3*i-1]=':'
}
十六进制[3*i]=nibbleToChar(地址[i]>>4)
十六进制[3*i+1]=半字节字符(地址[i])
}
返回字符串(十六进制[:]),无
}
func半字节字符(b字节)字节{
b&=0x0f
如果b>9{
返回('a'-10)+b
}
返回“0”+b
}
var ErrInvalidAddress=errors.New(“无效地址”)
func main(){
ipv6:=“fe80:01::af0”
fmt.Println(ipv6)
fmt.Println(expandIPv6Addr(ipv6))
}
.主包装
进口(
“错误”
“fmt”
“净额”
)
func expandIPv6Addr(s字符串)(字符串,错误){
addr:=net.ParseIP.To16()
如果addr==nil{
返回“”,ErrInvalidAddress
}
var十六进制[16*3]字节
对于i:=0;i0{
十六进制[3*i-1]=':'
}
十六进制[3*i]=nibbleToChar(地址[i]>>4)
十六进制[3*i+1]=半字节字符(地址[i])
}
返回字符串(十六进制[:]),无
}
func半字节字符(b字节)字节{
b&=0x0f
如果b>9{
返回('a'-10)+b
}
返回“0”+b
}
var ErrInvalidAddress=errors.New(“无效地址”)
func main(){
ipv6:=“fe80:01::af0”
fmt.Println(ipv6)
fmt.Println(expandIPv6Addr(ipv6))
}
.为
net.IP
值编写自己的格式化程序应该很简单。但是为什么呢?什么需要完整的IPv6地址?这似乎是一个不寻常的要求。它是一个内部API,需要一个完整的扩展ipv6地址,这真的让人恼火,就像一个有缺陷的API:)但即便如此,以您想要的格式打印[]字节应该很容易。为net.IP
值编写自己的格式化程序应该很简单。但是为什么呢?什么需要完整的IPv6地址?这似乎是一个不寻常的要求。它是一个内部API,需要一个完整的扩展ipv6地址,这真的很烦人,听起来像是一个有缺陷的API:),但即使如此,以您想要的格式打印[]字节应该很容易。谢谢!完美工作:)请确保添加检查,或仅在v6 IPs上使用此选项。如果这是一个v4 IP,它会因为越界而死机。@Adrian jep,我正在使用addr.To16()!=无
谢谢!完美工作:)请确保添加检查,或仅在v6 IPs上使用此选项。如果这是一个v4 IP,它会因为越界而死机。@Adrian jep,我正在使用addr.To16()!=无
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))
}