Go语言 将表示十六进制数的字符串转换为ipv6

b91juud3  于 2022-12-25  发布在  Go
关注(0)|答案(2)|浏览(274)

我用这个字符串表示hex:
000万美元
我想用网络包转换成IPv6
我期待的结果是(big endian):
20a:600::9:快00:快00:
我试过这个:

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:开始日期:开始日期:
谢谢!

gopyfrb3

gopyfrb31#

你的问题不清楚在比较时什么被反转了。通常,在切换字节序时,你反转了字节,但这似乎不是你在这里想要的。
在任何情况下,以下代码都可以使用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::

出于某种原因,它是反转每个段中的字节,以获得您所期望的结果,尽管这不是切换字节序。

vybvopom

vybvopom2#

试试这个:

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

字节是成对的,因此您需要同时翻转两个字节

相关问题