2013-02-21 4 views
2

나는 ip (ipv4, 192.168.161.125와 같은)를 얻습니다. 어떻게하면 내 PC가있는 서브넷을 얻을 수 있습니까? Java 메소드 및 문자열 형식 결과가 바람직합니다.자바에서 IP 주소에서 서브넷을 얻는 방법

서브넷은 IP 주소와 서브넷 마스크를 사용하여 계산 된 네트워크입니다.

감사합니다. 이것은 당신이 자바에서 그것을 할 것이다 어떻게

답변

4

,

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을, 내 PC의 IP는 192.168.161.125이며, 서브넷 마스크는 255.255.255.252이고 그 다음 서브 네트워크는 192.168.161.124이고 16 진수는 c0a8a17b입니다. 이것은 내가 잘 모르겠다는 비트 컴퓨팅에 관한 것입니다. 조언을 해줄 수 있습니까? 고마워요. – William

+0

그것이 작동합니다, 많이 고마워요. – William

+6

기회 당 당신은 [여기에 인용이 필요합니까] (http://tufar.com/ipcalculator/IPv4.java)? –

0

쉬운 방법. 의 2 개 문자열로 우리가 서브넷 마스크 및 IP 주소를 가지고 가정하자 : 내가 원하는 것은 내 PC가 예를 in.For있다 서브넷입니다

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 // 
관련 문제