go - 将表示十六进制数的字符串转换为 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::
谢谢!
解决方案
您的问题不清楚比较时正在反转什么。通常,在切换字节顺序时,您会反转字节,但这似乎不是您想要的。
无论如何,这里是使用IPAddress Go 库以多种不同方式反转的代码。免责声明:我是项目经理。
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::
出于某种原因,它反转了每个段中的字节,让您得到您所期望的,尽管这并没有切换字节顺序。
推荐阅读
- python - IPython 自动完成:通过 @property 装饰器访问子类属性
- css - Ionic 3 离子单选按钮显示选项彼此靠近使用 flex
- google-cloud-data-fusion - 谁能帮我解决数据融合中的这个错误代码
- mysql - 如何创建查询以检查给定字符串中包含哪些子字符串(来自数据库)?
- gradle - 转换为 gradle-kotlin-dsl Jfrog.Artifactory 配置
- react-native - Android 依赖 'com.google.firebase:firebase-iid' 的编译(16.0.0)和运行时(18.0.0)类路径有不同的版本
- sql-server - 如何撤销角色在 sql server 中的所有权限?
- azure-devops - 运行 dotnet restore 时出错 Microsoft.VisualStudio.Azure.Fabric.Application.props not found
- java - Android 应用启动时不显示 GIF
- sql - Postgres:无法在 JDBC 的 IN 子句中传递 id 列表