2010-05-31 43 views

Trả lời

52

Nó được bao phủ bởi apache utils.

Xem URL này: 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) 

Lưu ý: Để sử dụng w// 32 subnet CIDR, cho dụ, chúng ta cần thêm miêu tả sau:

utils.setInclusiveHostCount(true); 
+2

có vẻ như tiện ích có vấn đề với chỉ một thông báo địa chỉ. Ý tôi là; giả sử ip chỉ là một ip. vì vậy nếu tôi muốn sử dụng nó như ip/32 hơn nó không thành công. hoặc tôi đang sử dụng nó theo cách sai. –

+0

@OlgunKaya bạn đang sử dụng nó theo cách sai, hàm tạo cho thấy trong câu trả lời mong đợi ký pháp CIDR, nó là 'IP_address/MASK' không chỉ' IP_address'. – logoff

2

Thuật toán nằm trong mã giả (thực sự là PHP), bạn có thể tự dịch nó sang java.
Algoritm từ 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

Đây là cách bạn sẽ làm điều đó trong 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

/*** xấp xỉ bằng javascript. vì tôi cần điều này cho bản thân mình, tôi cũng có thể chia sẻ ***/ chức năng cidrToMask (cidrStr) { \t var parts = cidrStr.split ('/'); \t var ipStr = parts [0]; \t var prefix = (parts.length <1)? 0: Số (các bộ phận [1]); \t var mask = 0xffffffff << (32 - tiền tố); \t \t var maskStr = [(mặt nạ >>> 24), (mặt nạ >> 16 & 0xff), (mặt nạ >> 8 & 0xff), (mặt nạ & 0xff)] .join ('.'); \t cảnh báo ("Tiền tố =" + tiền tố + "\ n" + "Địa chỉ =" + ipStr + "\ n" + "Mask =" + maskStr); }; cidrToMask ('192.168.10.0/24'); – username

6

Sau câu trả lời Yuriy của: Để có được toàn bộ dải địa chỉ IP, lớp Apache Java SubnetUtils cung cấp các phương thức sau:

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

Để tải về jar chứa các lớp hãy truy cập: http://repo1.maven.org/maven2/commons-net/commons-net/3.0.1/commons-net-3.0.1.jar

Mã nguồn: 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

Bạn có thể sử dụng org.springframework.security.web.util.IpAddressMatcher từ Spring Framework.

SubnetUtils lớp
+0

https://github.com/edazdarevic/CIDRUtils cung cấp cho bạn hỗ trợ IPv6 và kiểm tra xem địa chỉ IP có nằm trong phạm vi hay không. Mặc dù chiều dài mặt nạ bị thiếu. Xem câu trả lời này http://stackoverflow.com/questions/558038/ipv4-ipv6-network-calculations-and-validation-for-java/15041513#15041513 –

0

Apache Java cung cấp sự giúp đỡ để làm một số điều này:

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

Dưới đây là một ví dụ Groovy đơn giản

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

đây là groovy tôi :)

//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

đây chủ yếu là mã Java xấu xí chỉ với một vài "def" s . Trong Groovy phù hợp, kích cỡ này sẽ bằng một nửa. – Renato

-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

Chào mừng. Bạn có thể cải thiện câu trả lời này bằng cách giải thích cách giải quyết vấn đề đặt ra trong câu hỏi. –

5

The IPAddress Java library sup cổng cả IPv4 và IPv6 theo cách đa hình bao gồm mạng con. Javadoc có sẵn tại liên kết. Disclaimer: Tôi là người quản lý dự án.

Tất cả các trường hợp sử dụng mà bạn liệt kê đều được hỗ trợ cho cả IPv4 và Ipv6 một cách minh bạch.

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

Tính năng này có sẵn dưới dạng phụ thuộc Maven không? –

+0

nó sẽ sớm, tôi sẽ cập nhật trang dự án khi nó là –

+0

bây giờ nó là, nó bây giờ là trong repo maven trung tâm: https://repo1.maven.org/maven2/com/github/seancfoley/ipaddress/2.0. 0 / –

3

Dòng lệnh Linux ipcalc. Bạn có thể nhanh chóng sử dụng:

$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 
Các vấn đề liên quan