将表示十六进制数的字符串转换为 ipv6
Convert string representing hex number to ipv6
我有这个代表十六进制的字符串:
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::
谢谢!
试试这个:
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]
}
字节成对出现,因此您需要同时翻转两者
你的问题不清楚你比较的时候是什么被反转了。通常,在切换字节顺序时,您会颠倒字节,但这似乎不是您想要的。
无论如何,这里的代码使用 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::
出于某种原因,它会反转每个段中的字节,让您得到您期望的结果,尽管这不是切换字节顺序。
我有这个代表十六进制的字符串:
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::
谢谢!
试试这个:
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]
}
字节成对出现,因此您需要同时翻转两者
你的问题不清楚你比较的时候是什么被反转了。通常,在切换字节顺序时,您会颠倒字节,但这似乎不是您想要的。
无论如何,这里的代码使用 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::
出于某种原因,它会反转每个段中的字节,让您得到您期望的结果,尽管这不是切换字节顺序。