2013-02-21 90 views
2

我得到的ip(ipv4,如192.168.161.125),我怎麼能得到我的電腦是子網? java方法和String格式結果是首選。如何從java中的ip地址獲得子網

子網是使用ip地址和子網掩碼計算的網絡

謝謝。

回答

4

這是你會怎麼做它在Java中,

import java.util.ArrayList; 
import java.util.List; 

public class IPv4 { 
    int baseIPnumeric; 
    int netmaskNumeric; 
    public IPv4(String symbolicIP, String netmask) throws NumberFormatException { 

     /* IP */ 
     String[] st = symbolicIP.split("\\."); 

     if (st.length != 4) 
      throw new NumberFormatException("Invalid IP address: " + symbolicIP); 

     int i = 24; 
     baseIPnumeric = 0; 

     for (int n = 0; n < st.length; n++) { 

      int value = Integer.parseInt(st[n]); 

      if (value != (value & 0xff)) { 

       throw new NumberFormatException("Invalid IP address: "+ symbolicIP); 
      } 

      baseIPnumeric += value << i; 
      i -= 8; 
     } 

     /* Netmask */ 
     st = netmask.split("\\."); 

     if (st.length != 4) 
      throw new NumberFormatException("Invalid netmask address: " 

        + netmask); 

     i = 24; 
     netmaskNumeric = 0; 

     if (Integer.parseInt(st[0]) < 255) { 

      throw new NumberFormatException(
        "The first byte of netmask can not be less than 255"); 
     } 
     for (int n = 0; n < st.length; n++) { 

      int value = Integer.parseInt(st[n]); 

      if (value != (value & 0xff)) { 

       throw new NumberFormatException("Invalid netmask address: " + netmask); 
      } 

      netmaskNumeric += value << i; 
      i -= 8; 

     } 
/* 
* see if there are zeroes inside netmask, like: 1111111101111 This is 
* illegal, throw exception if encountered. Netmask should always have 
* only ones, then only zeroes, like: 11111111110000 
*/ 
     boolean encounteredOne = false; 
     int ourMaskBitPattern = 1; 

     for (i = 0; i < 32; i++) { 

      if ((netmaskNumeric & ourMaskBitPattern) != 0) { 

       encounteredOne = true; // the bit is 1 
      } else { // the bit is 0 
       if (encounteredOne == true) 

        throw new NumberFormatException("Invalid netmask: " + netmask + " (bit " + (i + 1) + ")"); 
      } 

      ourMaskBitPattern = ourMaskBitPattern << 1; 
     } 
    } 

/** 
* Specify IP in CIDR format like: new IPv4("10.1.0.25/16"); 
* 
*@param IPinCIDRFormat 
*/ 
    public IPv4(String IPinCIDRFormat) throws NumberFormatException { 

     String[] st = IPinCIDRFormat.split("\\/"); 
     if (st.length != 2) 

      throw new NumberFormatException("Invalid CIDR format '" 
        + IPinCIDRFormat + "', should be: xx.xx.xx.xx/xx"); 

     String symbolicIP = st[0]; 
     String symbolicCIDR = st[1]; 

     Integer numericCIDR = new Integer(symbolicCIDR); 
     if (numericCIDR > 32) 

      throw new NumberFormatException("CIDR can not be greater than 32"); 

     /* IP */ 
     st = symbolicIP.split("\\."); 

     if (st.length != 4) 
      throw new NumberFormatException("Invalid IP address: " + symbolicIP); 

     int i = 24; 
     baseIPnumeric = 0; 

     for (int n = 0; n < st.length; n++) { 

      int value = Integer.parseInt(st[n]); 

      if (value != (value & 0xff)) { 

       throw new NumberFormatException("Invalid IP address: " + symbolicIP); 
      } 

      baseIPnumeric += value << i; 
      i -= 8; 

     } 

     /* netmask from CIDR */ 
     if (numericCIDR < 8) 
      throw new NumberFormatException("Netmask CIDR can not be less than 8"); 
     netmaskNumeric = 0xffffffff; 
     netmaskNumeric = netmaskNumeric << (32 - numericCIDR); 

    } 

    /** 
* Get the IP in symbolic form, i.e. xxx.xxx.xxx.xxx 
* 
*@return 
*/ 
    public String getIP() { 
     return convertNumericIpToSymbolic(baseIPnumeric); 

    } 

    private String convertNumericIpToSymbolic(Integer ip) { 
     StringBuffer sb = new StringBuffer(15); 

     for (int shift = 24; shift > 0; shift -= 8) { 

      // process 3 bytes, from high order byte down. 
      sb.append(Integer.toString((ip >>> shift) & 0xff)); 

      sb.append('.'); 
     } 
     sb.append(Integer.toString(ip & 0xff)); 

     return sb.toString(); 
    } 

/** 
* Get the net mask in symbolic form, i.e. xxx.xxx.xxx.xxx 
* 
*@return 
*/ 

    public String getNetmask() { 
     StringBuffer sb = new StringBuffer(15); 

     for (int shift = 24; shift > 0; shift -= 8) { 

      // process 3 bytes, from high order byte down. 
      sb.append(Integer.toString((netmaskNumeric >>> shift) & 0xff)); 

      sb.append('.'); 
     } 
     sb.append(Integer.toString(netmaskNumeric & 0xff)); 

     return sb.toString(); 
    } 

/** 
* Get the IP and netmask in CIDR form, i.e. xxx.xxx.xxx.xxx/xx 
* 
*@return 
*/ 

    public String getCIDR() { 
     int i; 
     for (i = 0; i < 32; i++) { 

      if ((netmaskNumeric << i) == 0) 
       break; 

     } 
     return convertNumericIpToSymbolic(baseIPnumeric & netmaskNumeric) + "/" + i; 
    } 

/** 
* Get an arry of all the IP addresses available for the IP and netmask/CIDR 
* given at initialization 
* 
*@return 
*/ 
    public List<String> getAvailableIPs(Integer numberofIPs) { 

     ArrayList<String> result = new ArrayList<String>(); 
     int numberOfBits; 

     for (numberOfBits = 0; numberOfBits < 32; numberOfBits++) { 

      if ((netmaskNumeric << numberOfBits) == 0) 
       break; 

     } 
     Integer numberOfIPs = 0; 
     for (int n = 0; n < (32 - numberOfBits); n++) { 

      numberOfIPs = numberOfIPs << 1; 
      numberOfIPs = numberOfIPs | 0x01; 

     } 

     Integer baseIP = baseIPnumeric & netmaskNumeric; 

     for (int i = 1; i < (numberOfIPs) && i < numberofIPs; i++) { 

      Integer ourIP = baseIP + i; 

      String ip = convertNumericIpToSymbolic(ourIP); 

      result.add(ip); 
     } 
     return result; 
    } 

/** 
* Range of hosts 
* 
*@return 
*/ 
    public String getHostAddressRange() { 

     int numberOfBits; 
     for (numberOfBits = 0; numberOfBits < 32; numberOfBits++) { 

      if ((netmaskNumeric << numberOfBits) == 0) 
       break; 
     } 
     Integer numberOfIPs = 0; 
     for (int n = 0; n < (32 - numberOfBits); n++) { 

      numberOfIPs = numberOfIPs << 1; 
      numberOfIPs = numberOfIPs | 0x01; 

     } 

     Integer baseIP = baseIPnumeric & netmaskNumeric; 
     String firstIP = convertNumericIpToSymbolic(baseIP + 1); 
     String lastIP = convertNumericIpToSymbolic(baseIP + numberOfIPs - 1); 
     return firstIP + " - " + lastIP; 
    } 

/** 
* Returns number of hosts available in given range 
* 
*@return number of hosts 
*/ 
    public Long getNumberOfHosts() { 
     int numberOfBits; 

     for (numberOfBits = 0; numberOfBits < 32; numberOfBits++) { 

      if ((netmaskNumeric << numberOfBits) == 0) 
       break; 

     } 

     Double x = Math.pow(2, (32 - numberOfBits)); 

     if (x == -1) 
      x = 1D; 

     return x.longValue(); 
    } 

/** 
* The XOR of the netmask 
* 
*@return wildcard mask in text form, i.e. 0.0.15.255 
*/ 

    public String getWildcardMask() { 
     Integer wildcardMask = netmaskNumeric^0xffffffff; 

     StringBuffer sb = new StringBuffer(15); 
     for (int shift = 24; shift > 0; shift -= 8) { 

      // process 3 bytes, from high order byte down. 
      sb.append(Integer.toString((wildcardMask >>> shift) & 0xff)); 

      sb.append('.'); 
     } 
     sb.append(Integer.toString(wildcardMask & 0xff)); 

     return sb.toString(); 

    } 

    public String getBroadcastAddress() { 

     if (netmaskNumeric == 0xffffffff) 
      return "0.0.0.0"; 

     int numberOfBits; 
     for (numberOfBits = 0; numberOfBits < 32; numberOfBits++) { 

      if ((netmaskNumeric << numberOfBits) == 0) 
       break; 

     } 
     Integer numberOfIPs = 0; 
     for (int n = 0; n < (32 - numberOfBits); n++) { 

      numberOfIPs = numberOfIPs << 1; 
      numberOfIPs = numberOfIPs | 0x01; 
     } 

     Integer baseIP = baseIPnumeric & netmaskNumeric; 
     Integer ourIP = baseIP + numberOfIPs; 

     String ip = convertNumericIpToSymbolic(ourIP); 

     return ip; 
    } 

    private String getBinary(Integer number) { 
     String result = ""; 

     Integer ourMaskBitPattern = 1; 
     for (int i = 1; i <= 32; i++) { 

      if ((number & ourMaskBitPattern) != 0) { 

       result = "1" + result; // the bit is 1 
      } else { // the bit is 0 

       result = "0" + result; 
      } 
      if ((i % 8) == 0 && i != 0 && i != 32) 

       result = "." + result; 
      ourMaskBitPattern = ourMaskBitPattern << 1; 

     } 
     return result; 
    } 

    public String getNetmaskInBinary() { 

     return getBinary(netmaskNumeric); 
    } 

/** 
* Checks if the given IP address contains in subnet 
* 
*@param IPaddress 
*@return 
*/ 
    public boolean contains(String IPaddress) { 

     Integer checkingIP = 0; 
     String[] st = IPaddress.split("\\."); 

     if (st.length != 4) 
      throw new NumberFormatException("Invalid IP address: " + IPaddress); 

     int i = 24; 
     for (int n = 0; n < st.length; n++) { 

      int value = Integer.parseInt(st[n]); 

      if (value != (value & 0xff)) { 

       throw new NumberFormatException("Invalid IP address: " 
         + IPaddress); 
      } 

      checkingIP += value << i; 
      i -= 8; 
     } 

     if ((baseIPnumeric & netmaskNumeric) == (checkingIP & netmaskNumeric)) 

      return true; 
     else 
      return false; 
    } 

    public boolean contains(IPv4 child) { 

     Integer subnetID = child.baseIPnumeric; 

     Integer subnetMask = child.netmaskNumeric; 

     if ((subnetID & this.netmaskNumeric) == (this.baseIPnumeric & this.netmaskNumeric)) { 

      if ((this.netmaskNumeric < subnetMask) == true 
        && this.baseIPnumeric <= subnetID) { 

       return true; 
      } 

     } 
     return false; 

    } 
/** 
*@param args 
*/ 
    public static void main(String[] args) { 
    IPv4 ipv4 = new IPv4("192.168.161.125/30"); //30 is the CIDR for Mask 255.255.255.252 
    System.out.println(ipv4.getCIDR()); 
    System.out.println(ipv4.getNetmask()); 
    System.out.println(ipv4.getNumberOfHosts()); 
    System.out.println(ipv4.getWildcardMask()); 
    System.out.println(ipv4.getBroadcastAddress()); 
    System.out.println(ipv4.getHostAddressRange()); 

    } 
} 
+0

您好,感謝一個lot.But我要的是子網其中我的電腦位於in.For例如,我的電腦的IP地址爲192.168.161.125,和子網掩碼是255.255.255.252,那麼子網是192.168.161.124,它的十六進制前者是c0a8a17b。這是關於位運算,我不熟悉。可以給我一些建議嗎?謝謝。 – William 2013-02-21 06:11:44

+0

它的工作原理,非常感謝。 – William 2013-02-21 07:49:22

+6

你有機會[需要引用](http://tufar.com/ipcalculator/IPv4.java)? – 2013-11-18 14:11:37

0

一個簡單的方法。讓我們假設我們有子網掩碼與IP地址分爲兩個字符串:

String[] mask  = subnetMaskString.split("\\."); 
String[] ipAddress = ipAddressString.split("\\."); 
StringBuffer ipSubnet = new StringBuffer(); 
for(int i=0; i<4; i++) 
    try{ 
     if(ipSubnet.length()>0) 
      ipSubnet.append('.'); 
     ipSubnet.append(Integer.parseInt(ipAddress[i]) & Integer.parseInt(mask[i])); 
    }catch(Exception x){ 
     //Integer parsing exception, wrong ipaddress or mask 
     break; 
    } 
// if no exception ipSubnet.toString() is the subnet ip //