如何获取不使用点分四边形的 IPv4 映射 IPv6 的字符串表示形式?

问题描述 投票:0回答:3

例如,考虑这个IPv4 映射的 IPv6 地址

::ffff:7f7f:7f7f
。在我测试过的所有浏览器的地址栏中提交
http://[::ffff:7f7f:7f7f]
时,格式都会保留:

omnibox

但是,

netip
(更具体地说,
String
netip.Addr
方法
)通过以IPv4点十进制表示法写入其最低有效32位来格式化所讨论的地址,例如所以:
::ffff:127.127.127.127

package main

import (
    "fmt"
    "log"
    "net/netip"
)

func main() {
    ip, err := netip.ParseAddr("::ffff:7f7f:7f7f")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(ip) // ::ffff:127.127.127.127
}

游乐场

我需要复制浏览器地址栏格式 IPv4 映射的 IPv6 地址的方式。 有没有办法让

netip
格式化
::ffff:7f7f:7f7f
,不是
::ffff:127.127.127.127
,而是
::ffff:7f7f:7f7f

go formatting ip-address ipv6 ipv4
3个回答
1
投票

首先,请记住,IPv4 映射的 IPv6 地址不允许在网络上使用,如 IANA IPv6 特殊用途地址注册表中所述,请注意,它们不能用作源地址或目标地址,不能用作转发或全局可路由,并且它们由 IP 本身保留它们不是实际的 IPv6 地址,只是 IPv6 格式的 IPv4 地址的表示形式,以便拥有公共地址存储,例如数据库。它们不应该在您的浏览器中工作。


0
投票

您可以使用

net.IP
而不是
netip.Addr
,根据文档:

Addr.String()

请注意,与包 net 的 IP.String 方法不同,IPv4 映射的 IPv6 地址格式在点分四元组之前带有“::ffff:”前缀。


0
投票

您可以使用ipaddress-go库,它可以生成各种字符串。免责声明:我是图书馆的项目经理。

addr := ipaddr.NewIPAddressString("::ffff:7f7f:7f7f").GetAddress()
addrStr := addr.String()
fmt.Println(addrStr)
mixedAddrStr, _ := addr.ToIPv6().ToMixedString()
fmt.Println(mixedAddrStr)

输出:

::ffff:7f7f:7f7f
::ffff:127.127.127.127
© www.soinside.com 2019 - 2024. All rights reserved.