2010-05-31 183 views

回答

52

這是Apache utils的覆蓋。

看到這個網址:http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/util/SubnetUtils.html

String subnet = "192.168.0.3/31"; 
SubnetUtils utils = new SubnetUtils(subnet); 

utils.getInfo().isInRange(address) 

注意:使用W// 32 CIDR子網,爲爲例,需要添加以下聲明:

utils.setInclusiveHostCount(true); 
+2

似乎該實用程序只有一個地址通知有問題。我的意思是;讓我們說,IP只是一個IP。所以如果我想使用它像ip/32比它失敗。或者我以錯誤的方式使用它。 – 2011-12-28 06:41:27

+0

@OlgunKaya你正在以錯誤的方式使用它,答案中顯示的構造函數需要CIDR表示法,它不是'IP_address/MASK',而是'IP_address'。 – logoff 2014-03-26 12:03:07

2

該算法是在僞代碼(實際上是PHP)中,您可以自己將它翻譯爲java。
Algoritm從here

//$ipNetmask = "192.168.1.12/30"; 
list($ip, $netmask) = split("/", $ipNetmask); 
$ip_elements_decimal = split("[.]", $ip); 
$netmask_result=""; 
for($i=1; $i <= $netmask; $i++) { 
    $netmask_result .= "1"; 
} 
for($i=$netmask+1; $i <= 32; $i++) { 
    $netmask_result .= "0"; 
} 
$netmask_ip_binary_array = str_split($netmask_result, 8); 
$netmask_ip_decimal_array = array(); 
foreach($netmask_ip_binary_array as $k => $v){ 
    $netmask_ip_decimal_array[$k] = bindec($v); // "100" => 4 
    $network_address_array[$k] = ($netmask_ip_decimal_array[$k] & $ip_elements_decimal[$k]); 
} 
$network_address = join(".", $network_address_array); 

// ------------------------------------------------ 
      // TCP/IP NETWORK INFORMATION 
// ------------------------------------------------ 
// IP Entered = ..................: 192.168.1.12 
// CIDR = ........................: /30 
// Netmask = .....................: 255.255.255.252 
// Network Address = .............: 192.168.1.12 

// Broadcast Address = ...........: 192.168.1.15 
// Usable IP Addresses = .........: 2 
// First Usable IP Address = .....: 192.168.1.13 
// Last Usable IP Address = ......: 192.168.1.14 
24

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

String[] parts = addr.split("/"); 
    String ip = parts[0]; 
    int prefix; 
    if (parts.length < 2) { 
     prefix = 0; 
    } else { 
     prefix = Integer.parseInt(parts[1]); 
    } 
    int mask = 0xffffffff << (32 - prefix); 
    System.out.println("Prefix=" + prefix); 
    System.out.println("Address=" + ip); 

    int value = mask; 
    byte[] bytes = new byte[]{ 
      (byte)(value >>> 24), (byte)(value >> 16 & 0xff), (byte)(value >> 8 & 0xff), (byte)(value & 0xff) }; 

    InetAddress netAddr = InetAddress.getByAddress(bytes); 
    System.out.println("Mask=" + netAddr.getHostAddress()); 
+2

/***近似在JavaScript。因爲我需要這個爲我自己,我可能分享***/ 函數cidrToMask(cidrStr){ \t var parts = cidrStr.split('/'); \t var ipStr = parts [0]; \t var prefix =(parts.length <1)? 0:數量(份數[1]); \t var mask = 0xffffffff <<(32 - 前綴); var maskStr = [(mask >>> 24),(mask >> 16&0xff),(mask >> 8&0xff),(mask&0xff)] .join('。'); \ n「+」Mask =「+ maskStr);這是一個簡單的方法。 }; cidrToMask('192.168.10.0/24'); – username 2011-11-07 02:42:06

6

繼尤里的回答是: 爲了獲得全部IP地址,Apache Java類SubnetUtils提供以下方法:

String[] addresses = utils.getInfo().getAllAddresses(); 

要下載包含類轉到罐子: http://repo1.maven.org/maven2/commons-net/commons-net/3.0.1/commons-net-3.0.1.jar

的源代碼: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/util/SubnetUtils.java?view=markup

Maven的ID:

<groupId>commons-net<groupId> 
<artifactId>commons-net<artifactId> 
<version>3.0.1<version> 
1

您可以使用org.springframework.security.web.util.IpAddressMatcher從Spring框架。

+0

https://github.com/edazdarevic/CIDRUtils爲您提供IPv6支持和測試,以查看IP地址是否在範圍內。儘管掩碼長度不存在。看到這個答案http://stackoverflow.com/questions/558038/ipv4-ipv6-network-calculations-and-validation-for-java/15041513#15041513 – 2013-06-10 09:48:15

0

Apache的Java類SubnetUtils提供幫助,做一些這樣的:

String[] parts = ipv4Cidr.split("/"); 
if (parts[1].equals("0")) 
{ 
    // This accepts all ip addresses. Technically not a subnet. 
    maskLength = 0; 
    maskAdress = "0.0.0.0" 
} 
else 
{ 
    maskLength = Integer.parseInt(parts[1]); 
    cidrInfo = new SubnetUtils(ipv4Cidr).getInfo(); 
    maskAdress = cidrInfo.asInteger(cidrInfo.getNetmask()); 
    networkAddress = cidrInfo.getNetworkAddress() 
} 
0

下面是一個簡單的Groovy例子

def cidrAddress = '192.168.10.0/24' 
def cidrAddressList = cidrAddress.tokenize("\\/") 
def baseIPAddress = cidrAddressList.first() 
def cidrIPMask = cidrAddressList.last().toInteger() 
def netMaskList = [] 
Integer fullOctets = cidrIPMask.intdiv(8) 
fullOctets.times {netMaskList.add('255')} 
def remainder = cidrIPMask % 8 
netMaskList.add((256 - (2 ** (8 - remainder))).toString()) 
netMaskList.addAll(['0','0','0','0']) 
def netMask = netMaskList.flatten().getAt(0..3).join('.') 
return [cidrAddress,baseIPAddress,cidrIPMask,netMask] 
1

這是我的Groovy的:)

//IP calculator by ku1gun 

// input 
String inputAddr = "12.34.56.78/20"; 

//magic 
def(String ipAddrBin, String maskAddrBin, String invertedMaskBin, int hostsCount) = getIpAddrAndCidrMaskBin(inputAddr); 

String broadcastAddr = retrieveBroadcastAddr(ipAddrBin, invertedMaskBin); 
String ipAddr = getTenBaseAddrValueFromBin(ipAddrBin); 
String maskAddr = getTenBaseAddrValueFromBin(maskAddrBin); 
String invertedMask = getTenBaseAddrValueFromBin(invertedMaskBin); 
String networkAddr = retrieveNetworkAddr(ipAddrBin, maskAddrBin); 

def (String ipMinVal, String ipMaxVal) = getMinMaxIpRangeValues(networkAddr, broadcastAddr) 

//Output "debug" results 
System.out.println("Variables:"); 
System.out.println("ipInput: " + ipAddr); 
System.out.println("MaskInput: " + maskAddr); 
System.out.println("invertedMask: " + invertedMask); 
System.out.println("-----------------------"); 
System.out.println("Binaries:"); 
System.out.println("ipBin: " + ipAddrBin); 
System.out.println("MaskInBin: " + maskAddrBin); 
System.out.println("InvertedMaskBin: " + invertedMaskBin); 
System.out.println("-----------------------"); 
System.out.println("Results:"); 
System.out.println("maskAddr: " + maskAddr); 
System.out.println("hostsCount: " + hostsCount); 
System.out.println("networkAddr: " + networkAddr); 
System.out.println("broadcastAddr: " + broadcastAddr); 
System.out.println("ipMinVal: " + ipMinVal); 
System.out.println("ipMaxVal: " + ipMaxVal); 
System.out.println("-----------------------"); 
System.out.println("IP range list:"); 

long ipStart = host2long(ipMinVal); 
long ipEnd = host2long(ipMaxVal); 


for (long i=ipStart; i<=ipEnd; i++) 
{ 
    System.out.println(long2dotted(i)); 
} 


//general methods 
def getIpAddrAndCidrMaskBin(String inputAddrStr) 
{ 
    def netMask = ""; 
    def invNetMask = ""; 

    def cidrAddressList = inputAddrStr.tokenize("\\/") 
    def baseIPAddress = cidrAddressList.first() 
    def cidrIPMask = cidrAddressList.last().toInteger() 

    //retrieve binaryNetMask and binaryInvertedNetMask 
    for(i=0; i<32; i++) 
    { 
     if(i<cidrIPMask) 
     { 
      netMask = netMask + "1"; 
      invNetMask = invNetMask + "0"; 
     } 
     else 
     { 
      netMask = netMask + "0"; 
      invNetMask = invNetMask + "1"; 
     } 
    } 

    //retrieve binaryIpAddress 
    String[] addrOctetArray = baseIPAddress.split("\\."); 
    String binAddr = ""; 
    for (String string : addrOctetArray) 
     { 
      int octet = Integer.parseInt(string);  
      String binaryOctet = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0'); 
      binAddr = binAddr + binaryOctet; 
     } 

    hostsCount = 2**(32 - cidrIPMask) - 2; 

    return [binAddr, netMask, invNetMask, hostsCount] 
} 

def getTenBaseAddrValueFromBin(String binVal) 
{ 
    tenBaseAddr = ""; 
    tenBaseAddr = tenBaseAddr + Integer.parseInt(binVal.substring(0,8), 2) + "." + Integer.parseInt(binVal.substring(8,16), 2) + "." + Integer.parseInt(binVal.substring(16,24), 2) + "." + Integer.parseInt(binVal.substring(24,32), 2) 
    return tenBaseAddr; 
} 

def retrieveBroadcastAddr(String ipAddrBin, String invertedMaskBin) 
{ 
    def oct_1 = Integer.parseInt(ipAddrBin.substring(0,8), 2) | Integer.parseInt(invertedMaskBin.substring(0,8), 2); 
    def oct_2 = Integer.parseInt(ipAddrBin.substring(8,16), 2) | Integer.parseInt(invertedMaskBin.substring(8,16), 2); 
    def oct_3 = Integer.parseInt(ipAddrBin.substring(16,24), 2) | Integer.parseInt(invertedMaskBin.substring(16,24), 2); 
    def oct_4 = Integer.parseInt(ipAddrBin.substring(24,32), 2) | Integer.parseInt(invertedMaskBin.substring(24,32), 2); 

    def t_oct = oct_1 + "."+ oct_2 + "." + oct_3 + "." + oct_4; 
    return t_oct 
} 

def retrieveNetworkAddr(String ipAddrBin, String maskInBin) 
{ 
    def oct_1 = Integer.parseInt(ipAddrBin.substring(0,8), 2) & Integer.parseInt(maskInBin.substring(0,8), 2); 
    def oct_2 = Integer.parseInt(ipAddrBin.substring(8,16), 2) & Integer.parseInt(maskInBin.substring(8,16), 2); 
    def oct_3 = Integer.parseInt(ipAddrBin.substring(16,24), 2) & Integer.parseInt(maskInBin.substring(16,24), 2); 
    def oct_4 = Integer.parseInt(ipAddrBin.substring(24,32), 2) & Integer.parseInt(maskInBin.substring(24,32), 2); 

    def t_oct = oct_1 + "."+ oct_2 + "." + oct_3 + "." + oct_4; 
    return t_oct 
} 

def getMinMaxIpRangeValues(networkAddr, broadcastAddr) 
{ 
    String[] ipAddrOctetArray = networkAddr.split("\\."); 
    String[] broadcastOctetArray = broadcastAddr.split("\\."); 

    String minRangeVal = ipAddrOctetArray[0] + "." + ipAddrOctetArray[1] + "." + ipAddrOctetArray[2] + "." + (Integer.parseInt(ipAddrOctetArray[3]) + 1) 
    String maxRangeVal = broadcastOctetArray[0] + "." +broadcastOctetArray[1] + "." +broadcastOctetArray[2] + "." + (Integer.parseInt(broadcastOctetArray[3]) - 1) 

    return[minRangeVal, maxRangeVal] 
} 

//IP list generate 
public static long host2long(String host) 
{ 
    long ip=0; 
    if (!Character.isDigit(host.charAt(0))) return -1; 
    int[] addr = ip2intarray(host); 
    if (addr == null) return -1; 
    for (int i=0;i<addr.length;++i) 
    { 
     ip += ((long)(addr[i]>=0 ? addr[i] : 0)) << 8*(3-i); 
    } 
    return ip; 
} 

public static int[] ip2intarray(String host) 
{ 
    Integer[] address = [-1,-1,-1,-1]; 
    int i=0; 
    StringTokenizer tokens = new StringTokenizer(host,"."); 
    if (tokens.countTokens() > 4) return null; 
    while (tokens.hasMoreTokens()) 
    { 
     try 
     { 
      address[i++] = Integer.parseInt(tokens.nextToken()) & 0xFF; 
     } 
     catch(NumberFormatException nfe) 
     { 
      return null; 
     } 
    } 
    return address; 
} 

public static String long2dotted(long ip) 
{ 
    // if ip is bigger than 255.255.255.255 or smaller than 0.0.0.0 
    if (ip > 4294967295l || ip < 0) 
    { 
     throw new IllegalArgumentException("invalid ip"); 
    } 
    StringBuilder ipAddress = new StringBuilder(); 
    for (int i = 3; i >= 0; i--) { 
     int shift = i * 8; 
     ipAddress.append((ip & (0xff << shift)) >> shift); 
     if (i > 0) { 
      ipAddress.append("."); 
     } 
    } 
    return ipAddress.toString(); 
} 
+1

這是主要是醜陋的Java代碼只有幾個「def」s 。在適當的Groovy中,這將是一半的大小。 – Renato 2016-07-08 06:38:48

-1
--plsql ip_calc by ku1gun 
with a as 
(
select 
    '12.34.56.78/20' ip 
from dual 
),b as 
(
select 
    utl_raw.concat(utl_raw.substr(utl_raw.cast_from_binary_integer(to_number(regexp_substr(ip,'[^.]+',1,1)),2),1,1),utl_raw.substr(utl_raw.cast_from_binary_integer(to_number(regexp_substr(ip,'[^.]+',1,2)),2),1,1),utl_raw.substr(utl_raw.cast_from_binary_integer(to_number(regexp_substr(ip,'[^.]+',1,3)),2),1,1),utl_raw.substr(utl_raw.cast_from_binary_integer(to_number(regexp_substr(replace(ip,'/','.'),'[^.]+',1,4)),2),1,1)) ip, 
    utl_raw.cast_from_binary_integer(power(2,32-to_number(regexp_substr(ip,'[^/]+',1,2)))-1) wildcard, 
    utl_raw.bit_xor(utl_raw.cast_from_binary_integer(-1),utl_raw.cast_from_binary_integer(power(2,32-to_number(regexp_substr(ip,'[^/]+',1,2)))-1)) mask 
from a 
),c as 
(
select 
    utl_raw.bit_and(ip,mask) network_address, 
    utl_raw.bit_or(utl_raw.bit_and(ip,mask),wildcard) broadcast_address, 
    utl_raw.cast_from_binary_integer(utl_raw.cast_to_binary_integer(utl_raw.bit_and(ip,mask))+1) first_adress, 
    utl_raw.cast_from_binary_integer(utl_raw.cast_to_binary_integer(utl_raw.bit_or(utl_raw.bit_and(ip,mask),wildcard))-1) last_adress, 
    utl_raw.cast_from_binary_integer(utl_raw.cast_to_binary_integer(utl_raw.bit_and(ip,mask))+level) ip_address 
from b 
connect by level<utl_raw.cast_to_binary_integer(utl_raw.bit_or(utl_raw.bit_and(ip,mask),wildcard))-utl_raw.cast_to_binary_integer(utl_raw.bit_and(ip,mask)) 
) 
select 
    to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(network_address,1,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(network_address,2,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(network_address,3,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(network_address,4,1))) network_address, 
    to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(broadcast_address,1,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(broadcast_address,2,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(broadcast_address,3,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(broadcast_address,4,1))) broadcast_address, 
    to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(first_adress,1,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(first_adress,2,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(first_adress,3,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(first_adress,4,1))) first_adress, 
    to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(last_adress,1,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(last_adress,2,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(last_adress,3,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(last_adress,4,1))) last_adress, 
    to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(ip_address,1,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(ip_address,2,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(ip_address,3,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(ip_address,4,1))) ip_address 
from c 
; 
+3

歡迎。你可以通過解釋如何解決問題中提出的問題來改善這個問題。 – 2016-04-19 14:09:46

5

The IPAddress Java library sup以包括子網在內的多態方式連接IPv4和IPv6。 javadoc可在鏈接中找到。免責聲明:我是項目經理。

您列出的所有用例均透明地支持IPv4和Ipv6。

String str = "192.168.10.0/24"; 
    IPAddressString addrString = new IPAddressString(str); 
    try { 
     IPAddress addr = addrString.toAddress(); 
     Integer prefix = addr.getNetworkPrefixLength(); //24 
     IPAddress mask = addr.getNetwork().getNetworkMask(prefix, false);//255.255.255.0 
     IPAddress networkAddr = addr.mask(mask); //192.168.10.0 
     IPAddress networkAddrOtherWay = addr.getLower().removePrefixLength(); //192.168.10.0 

     ... 
    } catch(AddressStringException e) { 
     //e.getMessage provides validation issue 
    } 
+0

這是否可用作Maven依賴項? – 2016-10-28 16:46:46

+0

它將很快,我會更新項目頁面時,它現在是 – 2016-10-29 01:46:01

+0

它現在在Maven中央回購:https://repo1.maven.org/maven2/com/github/seancfoley/ipaddress/2.0。 0 / – 2017-03-05 01:57:18

3

Linux命令行ipcalc。 您可以快速使用:

$ipcalc 192.168.10.0/24 
Address: 192.168.10.0   11000000.10101000.00001010. 00000000 
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000 
Wildcard: 0.0.0.255   00000000.00000000.00000000. 11111111 
=> 
Network: 192.168.10.0/24  11000000.10101000.00001010. 00000000 
HostMin: 192.168.10.1   11000000.10101000.00001010. 00000001 
HostMax: 192.168.10.254  11000000.10101000.00001010. 11111110 
Broadcast: 192.168.10.255  11000000.10101000.00001010. 11111111 
Hosts/Net: 254     Class C, Private Internet