兩個ip比較 前多少位相同

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);
}

ip-int-byte[]互轉-使用java原生api

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章