Go 是否有用于扩展ipv6地址的内置函数?

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地址的项目。Go中是否有内置功能

我现在正在做的是

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))
}