2
我得到的ip(ipv4,如192.168.161.125),我怎麼能得到我的電腦是子網? java方法和String格式結果是首選。如何從java中的ip地址獲得子網
子網是使用ip地址和子網掩碼計算的網絡
謝謝。
我得到的ip(ipv4,如192.168.161.125),我怎麼能得到我的電腦是子網? java方法和String格式結果是首選。如何從java中的ip地址獲得子網
子網是使用ip地址和子網掩碼計算的網絡
謝謝。
這是你會怎麼做它在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());
}
}
一個簡單的方法。讓我們假設我們有子網掩碼與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 //
您好,感謝一個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
它的工作原理,非常感謝。 – William 2013-02-21 07:49:22
你有機會[需要引用](http://tufar.com/ipcalculator/IPv4.java)? – 2013-11-18 14:11:37