我的问题是如何获取指定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公共库可以做到这一点,但我只想在不使用库的情况下完成
答案 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。
希望有帮助。