Skip to content

Instantly share code, notes, and snippets.

@nboubakr
Created October 14, 2013 16:26
Show Gist options
  • Save nboubakr/6978303 to your computer and use it in GitHub Desktop.
Save nboubakr/6978303 to your computer and use it in GitHub Desktop.
Check if an IPv6 is a valid address or not.
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