private static final int IPV4BYTES = 4;
private static final int BYTEBITS = 8;
public static String getNetworkAddressAndNumMask(String startAddress, String endAddress) {
String networkAddress = "";
int mask = 0;
String[] startStrArr = startAddress.split("\\.");
int[] startNums = Arrays.asList(startStrArr).stream().mapToInt(Integer::parseInt).toArray();
String[] endStrArr = endAddress.split("\\.");
int[] endNums = Arrays.asList(endStrArr).stream().mapToInt(Integer::parseInt).toArray();
for (int i = 0; i < IPV4BYTES; i++) {
int xorValue = startNums[i] ^ endNums[i];
if (xorValue > 0) {
for (int j = 1; j <= BYTEBITS; j++) {
if ((xorValue >>> j) == 0) {
mask += (BYTEBITS - j);
break;
}
}
break;
} else {
mask += BYTEBITS;
}
}
int[] networkNums = new int[IPV4BYTES];
for (int i = 0; i < IPV4BYTES; i++) {
if (mask / BYTEBITS > i) {
networkNums[i] = startNums[i];
} else if (mask / BYTEBITS == i) {
networkNums[i] = startNums[i] & (255 << (BYTEBITS - mask % BYTEBITS));
} else {
networkNums[i] = 0;
}
}
networkAddress = StringUtils.join(networkNums, ".");
return networkAddress + "/" + mask;
}
public static String getNetworkAddressAndDottedDecimalMask(String startAddress, String endAddress) {
String networkMask = getNetworkAddressAndNumMask(startAddress, endAddress);
String networkAddress = networkMask.split("/")[0];
int numMask = Integer.parseInt(networkMask.split("/")[1]);
String dottedDecimalMask = numMaskToDottedDecimalMask(numMask);
return networkAddress + " " + dottedDecimalMask;
}
public static String numMaskToDottedDecimalMask(int numMask) {
int[] networkNums = new int[IPV4BYTES];
for (int i = 0; i < IPV4BYTES; i++) {
if (numMask / BYTEBITS > i) {
networkNums[i] = 255;
} else if (numMask / BYTEBITS == i) {
networkNums[i] = (255 << (BYTEBITS - numMask % BYTEBITS)) & 255;
} else {
networkNums[i] = 0;
}
}
return StringUtils.join(networkNums, ".");
}
public static int dottedDecimalMaskToNumMask(String dottedDecimalMask) {
int numMask = 0;
String[] maskStr = dottedDecimalMask.split("\\.");
int[] maskInt = Arrays.asList(maskStr).stream().mapToInt(Integer::parseInt).toArray();
for (int i = 0; i < IPV4BYTES && maskInt[i] > 0; i++) {
for (int j = 1; j <= BYTEBITS; j++) {
if ((maskInt[i] << j & 255) == 0) {
numMask += j;
break;
}
}
}
return numMask;
}
public static String getIPv6NetworkAddressAndPrefixLength(String startAddress, String endAddress) {
String networkAddress = "";
int prefixLen = 0;
startAddress = parseFullIPv6(startAddress);
endAddress = parseFullIPv6(endAddress);
String[] startStrArr = startAddress.split(":");
int[] startNums = new int[8];
for (int i = 0; i < startStrArr.length; i++) {
startNums[i] = Integer.parseInt(startStrArr[i], 16);
}
String[] endStrArr = endAddress.split(":");
int[] endNums = new int[8];
for (int i = 0; i < endStrArr.length; i++) {
endNums[i] = Integer.parseInt(endStrArr[i], 16);
}
for (int i = 0; i < 8; i++) {
int xorValue = startNums[i] ^ endNums[i];
if (xorValue > 0) {
for (int j = 1; j <= 16; j++) {
if ((xorValue >>> j) == 0) {
prefixLen += (16 - j);
break;
}
}
break;
} else {
prefixLen += 16;
}
}
String[] networkStrArr = new String[8];
for (int i = 0; i < 8; i++) {
if (prefixLen / 16 > i) {
networkStrArr[i] = startStrArr[i];
} else if (prefixLen / 16 == i) {
networkStrArr[i] = Integer.toHexString(startNums[i] & (65535 << (16 - prefixLen % 16)));
} else {
networkStrArr[i] = "0";
}
}
networkAddress = StringUtils.join(networkStrArr, ":");
return networkAddress + "/" + prefixLen;
}