如何从IP地址获取最大主机数

时间:2018-09-08 06:55:37

标签: java binary byte ip-address

我的问题是如何获取指定IP地址所属的网络上可以使用的最大主机数。

我有一个像这样的java方法,它有两个参数ip address和subnet mask address。 当我谷歌我发现了公式,但我不知道如何用Java编写。 公式是

  

最大主机数可以根据主机数确定   在网络中可用,它是通过减去两个获得的数字   和广播地址的数量。

public static int maxHostNum(String _ip, String _subnetMask) throws UnknownHostException {
    byte[] bIP = InetAddress.getByName(_ip).getAddress();
    byte[] bSB = InetAddress.getByName(_subnetMask).getAddress();
    byte[] bNT = new byte[4];
    for (int i=0; i<bIP.length; i++) {
        bNT[i] = (byte) (~bSB[i] | bIP[i]);
    }
    String broadcastAddress = InetAddress.getByAddress(bNT).toString();

    // i dont know the rest

    return maxHostNum;
}

我知道Apache公共库可以做到这一点,但我只想在不使用库的情况下完成

2 个答案:

答案 0 :(得分:1)

子网掩码通过在掩码和IP之间执行按位与运算来获取网络IP,从而确定IP地址的哪一部分是网络IP,哪一部分是设备的IP。例如:

192.168.3.45 ->    11000000.10101000.00000011.00101101
255.255.255.240 -> 11111111.11111111.11111111.11110000
Network IP ->      11000000.10101000.00000011.00100000 <- because the last 4 digits of the subnet mask were 0 here, the resulting network IP bits are also 0.
Host IP ->         00000000.00000000.00000000.00001101

因此,由于在上面的示例中,最后4位数字确定了主机IP,因此您应该有2 ^ 4个可用IP地址,但实际上您有2 ^ 4-2,因为所有主机位都是1或2的地址。 0是特殊字符,不能用于特定设备。

因此,要知道网络可以支持多少个主机IP,您可以简单地将子网掩码的值反转并将其转换为整数:

int result = 0;
for (int i = 0; i < bSB.length; i++) {
    result <<= 8; // Bit shift 8 digits to the left.
    result |= ~bSB[i]; // Perform bitwise or-equals with the bitwise inverted value of bSB[i]
}
result <<= 8;
result -= 2; // Special IPs

结果整数是可能的主机IP的数量。

答案 1 :(得分:1)

如果您可以转换为cidr表示法,将很容易,因为最终会得到2个公式:

Nbr子网= 2 ^(cidr级)。 Nbr主机= 2 ^(32-cidr)-2。

如果A类是= 8,如果是B级,则为16;如果是C类,则为24。

希望有帮助。