ipv6地址解压缩算法

文章概述
本文介绍了一种将IPv6地址进行解压缩的算法。该算法的思想是将地址中的双冒号::分割,然后计算两边的长度,长度小于8则添加0,直到等于8个长度,再将这8个元素补充到16位。其中遵循两个规则:第一,分割后的两个部分的长度加起来必须是8个X;第二,不足16位补充到16位,16位等于2字节,2字节需要4个16进制符号表示。该算法可以将压缩的IPv6地址转化为标准的IPv6地址格式。
关键要点
1.文章介绍了一种IPv6地址解压缩算法。
2.解压算法的思想是将双冒号“::”分割成两部分,并计算它们的长度。
3.如果长度小于8,则添加0,直到等于8个长度。
4.最后将这8个元素补充到16位。
5.算法需要遵守两个规则,分别是:第一,分割后的两部分长度加起来必须是8个X;第二,不足16位的部分需要补充到16位。
介绍
网络上比较多 Ipv6 地址压缩算法。今天查找了关于 Ipv6 地址的解压缩算法,但是找不到,自己写了一个。
思想是分割双冒号 :: ,然后计算两边的长度,长度小于 8 则添加 0 ,直到等于 8 个长度,再把这 8 个元素补充到16位。
需要详细理解则需要查看两个规则。
func FullFormatIpv6(ip string) (string, error) {
newIp := net.ParseIP(ip)
if newIp == nil {
return "", errors.New("ipv6地址错误")
}
ip = newIp.String()
if strings.Contains(ip, "::") {
ips := strings.Split(ip, "::")
first := ips[0]
second := ips[1]
if len(first) == 0 {
first = "0"
}
if len(second) == 0 {
second = "0"
}
// IPv6 格式为 X:X:X:X:X:X:X:X
// 规则一:first 与 second 长度加起来必须是 8 个 X
firstSlice := strings.Split(first, ":")
secondSlice := strings.Split(second, ":")
for len(firstSlice)+len(secondSlice) < 8 {
firstSlice = append(firstSlice, "0")
}
firstSlice = append(firstSlice, secondSlice...)
newSlice := make([]string, 0)
for _, v := range firstSlice {
//规则二:不足16位补充到16位,16位等于2字节,2字节需要4个16进制符号表示。需要转换。
str := fmt.Sprintf("%04s", v)
newSlice = append(newSlice, str)
}
ipv6 := strings.Join(newSlice, ":")
return ipv6, nil
} else {
ips := strings.Split(ip, ":")
newSlice := make([]string, 0)
for _, v := range ips {
//规则二:不足16位补充到16位,16位等于2字节,2字节需要4个16进制符号表示。需要转换。
str := fmt.Sprintf("%04s", v)
newSlice = append(newSlice, str)
}
ipv6 := strings.Join(newSlice, ":")
return ipv6, nil
}
}
测试函数
func TestFullFormatIpv6(t *testing.T) {
ip := "1::f:0:0:f:af00"
str, err := FullFormatIpv6(ip)
if err != nil {
fmt.Println(err)
}
fmt.Println(str)
}
// 输出:
// 0001:0000:0000:000f:0000:0000:000f:af00
// PASS
总结
注意两个转换规则