Created
October 14, 2013 16:26
-
-
Save nboubakr/6978303 to your computer and use it in GitHub Desktop.
Check if an IPv6 is a valid address or not.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public boolean IsValidAddress(String ipAddr) { | |
int nDC = 0; | |
int nC = 0; | |
ipAddr = ipAddr.trim(); | |
String s = ipAddr; | |
char[] chars = s.toCharArray(); | |
/* 0- Error: Empty */ | |
if (s.isEmpty()) { | |
return false; | |
} | |
/* 1- Error: UNDEFINED '::' */ | |
if (s.equals("::")) { | |
return false; | |
} | |
/* 2- Error: Triple or more columns entered */ | |
if ((s.length() <= 1) || (s.contains(":::"))) { | |
return false; | |
} | |
/* 3- Error: Not valid hex */ | |
if (!Pattern.matches("^[0-9A-Fa-f:]+$", s)) { | |
return false; | |
} | |
/* 4- Error: Cannot start or end with ':' */ | |
if (chars[0] == ':' && chars[1] != ':') { | |
return false; | |
} | |
if (chars[s.length() - 1] == ':' && chars[s.length() - 2] != ':') { | |
return false; | |
} | |
/* 5- Error: More than 2 Bytes */ | |
String[] sa = s.split(":", -1); | |
for (int j = 0; j < sa.length; j++) { | |
if (sa[j].length() > 4) { | |
return false; | |
} | |
} | |
/* 6- Error: Count of DoubleColumns and Columns */ | |
s = ipAddr; | |
nDC = s.split("::", -1).length - 1; | |
s = s.replace("::", "**"); | |
nC = s.split(":", -1).length - 1; | |
/* Case I- DoubleColumn can only appear once - RFC4291 */ | |
if (nDC > 1) { | |
return false; | |
} | |
/* Case II- No DoubleColumns means there must be 7 columns */ | |
if (nDC == 0 && nC != 7) { | |
return false; | |
} | |
/* Case III- If DoubleColumn at start/end, max. columns must be 6 or less */ | |
s = ipAddr; | |
int sL = s.length(); | |
if ((chars[0] == ':' && chars[1] == ':') | |
|| (chars[sL - 1] == ':' && chars[sL - 2] == ':')) { | |
if (nDC == 1 && nC > 6) { | |
return false; | |
} | |
} | |
/* Case IV- If DoubleColumn in middle, max. columns must be 5 or less */ | |
else if (nDC == 1 && nC > 5) { | |
return false; | |
} | |
/* End of Check */ | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment