IPV6地址校验(java)
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 |
?
總結
以上是生活随笔為你收集整理的IPV6地址校验(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipv4校验(java)
- 下一篇: java获取UUID与UUID的校验