2019最新《黑马C/C++全栈培训第24期教程 附带源码+笔记 》

IPv6介绍
IPV6的长度是128位,相比于ipv4的32位,极大的扩展了ip地址可用空间。ipv4地址现在被视为一种稀缺资源,而ipv6地址相当充足,在可以预见的未来是用不完的。这有一段描述:如果地球表面(含陆地和水面)都覆盖着计算机,那么IPv6允许每平方米拥有7*10^23个IP地址;如果地址分配的速率是每微秒100万个,那么需要10^19年才能将所有的地址分配完毕。

IPv6地址
IPv6的128位地址通常写成8组,每组为四个十六进制数的形式。比如:

AD80:0000:0000:0000:ABAA:0000:00C2:0002

是一个合法的IPv6地址。这个地址比较长,看起来不方便也不易于书写。零压缩法可以用来缩减其长度。如果几个连续段位的值都是0,那么这些0就可以简单的以::来表示,上述地址就可写成:

AD80::ABAA:0000:00C2:0002

这个简化只能用一次,在上例中的ABAA后面的0000就不能再次简化。当然也可以在ABAA后面使用::,这样的话前面的12个0就不能压缩了。这个限制的目的是为了能准确还原被压缩的0,不然就无法确定每个::代表了多少个0。例如,下面是一些合法的IPv6地址:

CDCD:910A:2222:5498:8475:1111:3900:2020

1030::C9B4:FF12:48AA:1A2B

2000:0:0:0:0:0:0:1

::0:0:0:0:0:0:1

2000:0:0:0:0::

校验代码:
 
 
import java.text.Normalizer;
import java.text.Normalizer.Form;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class IPV6Test {
 
    public static void main(String[] args) {
        String ipv61 = "2001:db8:a583:64:c68c:d6df:600c:ee9a";
        String ipv62 = "2001:db8:a583::9e42:be55:53a7";
        String ipv63 = "2001:db8:a583:::9e42:be55:53a7";
        String ipv64 = "1:2:3:4:5::";
        String ipv65 = "CDCD:910A:2222:5498:8475:1111:3900:2020";
        String ipv66 = "1030::C9B4:FF12:48AA:1A2B";
        String ipv67 = "2000:0:0:0:0:0:0:1";
        String ipv68 = "::0:0:0:0:0:0:1";
        String ipv69 = "2000:0:0:0:0::";
        
        System.out.println("check > " + ipv61 + " > " + isValidIpv6Addr(ipv61));
        System.out.println("check > " + ipv62 + " > " + isValidIpv6Addr(ipv62));
        System.out.println("check > " + ipv63 + " > " + isValidIpv6Addr(ipv63));
        System.out.println("check > " + ipv64 + " > " + isValidIpv6Addr(ipv64));
        System.out.println("check > " + ipv65 + " > " + isValidIpv6Addr(ipv65));
        System.out.println("check > " + ipv66 + " > " + isValidIpv6Addr(ipv66));
        System.out.println("check > " + ipv67 + " > " + isValidIpv6Addr(ipv67));
        System.out.println("check > " + ipv68 + " > " + isValidIpv6Addr(ipv68));
        System.out.println("check > " + ipv69 + " > " + isValidIpv6Addr(ipv69));
        
    }
 
    public static boolean isValidIpv6Addr(String ipAddr) {
 
        String regex = "(^((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4}){1}|:))"
                + "|(([0-9A-Fa-f]{1,4}:){6}((:[0-9A-Fa-f]{1,4}){1}|"
                + "((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
                + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
                + "(([0-9A-Fa-f]{1,4}:){5}((:[0-9A-Fa-f]{1,4}){1,2}|"
                + ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
                + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
                + "(([0-9A-Fa-f]{1,4}:){4}((:[0-9A-Fa-f]{1,4}){1,3}"
                + "|:((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|"
                + "([0-9]){1,2})){3})|:))|(([0-9A-Fa-f]{1,4}:){3}((:[0-9A-Fa-f]{1,4}){1,4}|"
                + ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
                + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
                + "(([0-9A-Fa-f]{1,4}:){2}((:[0-9A-Fa-f]{1,4}){1,5}|"
                + ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
                + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))"
                + "|(([0-9A-Fa-f]{1,4}:){1}((:[0-9A-Fa-f]{1,4}){1,6}"
                + "|:((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
                + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
                + "(:((:[0-9A-Fa-f]{1,4}){1,7}|(:[fF]{4}){0,1}:((22[0-3]|2[0-1][0-9]|"
                + "[0-1][0-9][0-9]|([0-9]){1,2})"
                + "([.](25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|([0-9]){1,2})){3})|:)))$)";
 
        if (ipAddr == null) {
            System.out.println("ipv6 addresss is null ");
            return false;
        }
        ipAddr = Normalizer.normalize(ipAddr, Form.NFKC);
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(ipAddr);
 
        boolean match = matcher.matches();
        if (!match) {
            // System.out.println("invalid ipv6 addresss = " + ipAddr);
        }
 
        return match;
    }
 
}
测试结果:
check > 2001:db8:a583:64:c68c:d6df:600c:ee9a > true
check > 2001:db8:a583::9e42:be55:53a7 > true
check > 2001:db8:a583:::9e42:be55:53a7 > false
check > 1:2:3:4:5:: > true
check > CDCD:910A:2222:5498:8475:1111:3900:2020 > true
check > 1030::C9B4:FF12:48AA:1A2B > true
check > 2000:0:0:0:0:0:0:1 > true
check > ::0:0:0:0:0:0:1 > true
check > 2000:0:0:0:0:: > true
 


--------------------- 
作者:kangyucheng 
来源:CSDN 
原文:https://blog.csdn.net/Kangyucheng/article/details/86497891 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/guansd/article/details/87878138
今日推荐