【问题标题】:Convert string representing hex number to ipv6将表示十六进制数的字符串转换为 ipv6
【发布时间】:2021-05-03 18:02:24
【问题描述】:

我有这个代表十六进制的字符串:

00000000ff00ff00000900000600020a

我正在尝试使用 net 包将其转换为 IPv6

我期待的结果是(大端):

20a:600::9:ff00:ff00::

我试过了:

    ip := "00000000ff00ff00000900000600020a"
    res := make(net.IP, net.IPv6len)
    var err error
    res,err = hex.DecodeString(ip)
    if err != nil {
        fmt.Println("error")
    }
    for i := 0; i < 16/2; i++ {
        res[i], res[16-1-i] = res[16-1-i], res[i]
    }
    fmt.Println(res.String())

但我明白了:

a02:6:0:900:ff:ff::

谢谢!

【问题讨论】:

  • 你期待的结果真的正确吗?
  • IPv6地址被重传16个字节;没有与 IPv6 地址关联的字节顺序。您期望的结果不是有效的 IPv6 地址,所以我不知道如何从给定的格式中获取它。
  • 我猜你实际上是在寻找地址20a:600:0:9:ff00:ff00::,它来自八个 16 字节组的逆序,而不是颠倒每个单独的字节。这将是非常不寻常的,因此我建议您首先验证您正在使用的数据是否正确。
  • 我将预期结果固定为 20a:600::9:ff00:ff00:: 你说得对
  • 20a:600::9:ff00:ff00:: 是一个不允许使用的保留 Ipv6 地址。所有全球 IPv6 地址都在 2000::/3 范围内,并且 IANA IPv6 Special-Purpose Address Registry 具有有效的特殊用途范围,但您的地址不适合任何范围。

标签: go ipv6 glide-golang


【解决方案1】:

试试这个:

for i := 0; i < 16/2; i += 2 {
    res[i], res[16-2-i] = res[16-2-i], res[i]
    res[i+1], res[16-1-i] = res[16-1-i], res[i+1]
}

字节成对出现,所以你需要同时翻转两个

【讨论】:

  • 你能解释一下你在第一个for循环中做了什么
  • 只是在没有 int 的情况下进行了更改,我将切片两两反转
【解决方案2】:

您的问题不清楚比较时正在反转什么。通常,在切换字节顺序时,您会反转字节,但这似乎不是您想要的。

无论如何,这里有许多不同方式的逆向代码,使用IPAddress Go library。免责声明:我是项目经理。

str := "00000000ff00ff00000900000600020a"
ipAddr := ipaddr.NewIPAddressString(str).GetAddress()
reversedAddr, _ := ipAddr.ReverseBytes()
reverseEachSegment := ipAddr.ReverseSegments()
reverseBitsEachByte, _ := ipAddr.ReverseBits(true)
reverseBits, _ := ipAddr.ReverseBits(false)
fmt.Println("original", ipAddr)
fmt.Println("bytes reversed", reversedAddr)
fmt.Println("bytes reversed in each segment", reverseEachSegment)
fmt.Println("bits reversed in each byte", reverseBitsEachByte)
fmt.Println("bits reversed", reverseBits)

输出:

original ::ff00:ff00:9:0:600:20a
bytes reversed a02:6:0:900:ff:ff::
bytes reversed in each segment 20a:600:0:9:ff00:ff00::
bits reversed in each byte ::ff00:ff00:90:0:6000:4050
bits reversed 5040:60:0:9000:ff:ff::

由于某种原因,它会反转每个段中的字节,从而得到您所期望的,尽管这并没有切换字节序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2017-05-16
    • 2018-01-31
    • 2018-01-22
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多