public static byte[] ipToBytes(String ipInput) throws UnknownHostException {
logger.debug("ipToBytes {}", ipInput);
int c = ipInput.indexOf(':');
if (c >= 0) {
ipInput = ipInput.subSequence(0, c).toString();
}
byte[] userAddress = InetAddress.getByName(ipInput).getAddress();
return userAddress;
}
/**
* 沒有補零
*/
public static int sameBitNum(String ip1, String ip2) throws UnknownHostException {
byte[] bytes1 = ipToBytes(ip1);
byte[] bytes2 = ipToBytes(ip2);
int sameCount = 0;
for (int i = 0; i < bytes1.length; i++) {
String binaryString1 = Integer.toBinaryString(bytes1[i]);
String binaryString2 = Integer.toBinaryString(bytes2[i]);
char[] chars1 = binaryString1.toCharArray();
char[] chars2 = binaryString2.toCharArray();
// 從最高位還是算
int bitNum = 8;
for (int j = 0; j < bitNum; j++) {
int index1 = j - (bitNum - chars1.length);
int index2 = j - (bitNum - chars2.length);
if (index1 < 0 && index2 < 0) {
// index都還沒到0,說明bit位是0值.
sameCount++;
} else if (index1 >= 0 && index1 == index2 && chars1[index1] == chars2[index2]) {
sameCount++;
} else {
return sameCount;
}
}
}
return sameCount;
}
@Test
public void test() throws UnknownHostException {
int sameBitNum = NetInfoUtils.sameBitNum("255.0.0.1:123", "2.0.0.1");
Assert.assertEquals(0, sameBitNum);
sameBitNum = NetInfoUtils.sameBitNum("127.0.0.1:123", "2.0.0.1");
Assert.assertEquals(1, sameBitNum);
sameBitNum = NetInfoUtils.sameBitNum("127.0.0.1:123", "1.0.0.1");
Assert.assertEquals(1, sameBitNum);
sameBitNum = NetInfoUtils.sameBitNum("3.0.0.1:123", "2.0.0.1");
Assert.assertEquals(7, sameBitNum);
sameBitNum = NetInfoUtils.sameBitNum("1.0.0.1:123", "2.0.0.1");
Assert.assertEquals(6, sameBitNum);
sameBitNum = NetInfoUtils.sameBitNum("1.0.0.1:123", "3.0.0.1");
Assert.assertEquals(6, sameBitNum);
sameBitNum = NetInfoUtils.sameBitNum("0.0.0.1:123", "3.0.0.1");
Assert.assertEquals(6, sameBitNum);
sameBitNum = NetInfoUtils.sameBitNum("0.0.0.1:123", "1.0.0.1");
Assert.assertEquals(7, sameBitNum);
}