ipv6地址解压缩算法

作者:

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

总结

注意两个转换规则