Java之IP、子網掩碼、網絡號、廣播地址之間轉換與獲取


一、判斷子網掩碼的有效性 

子網掩碼滿足的條件:

  1. 是一個合法的IP地址
  2. 掩碼中的1是連續的
  3. 各類地址中掩碼的范圍(此文中不做判斷)

Java實現:

 1 //掩碼是否是連續1判斷   
 2  private boolean IsSubnetMask(String netmask) {
 3         String[] masks = netmask.split("\\.");
 4         int mask = (Integer.parseInt(masks[0]) << 24) | (Integer.parseInt(masks[1]) << 16) | (Integer.parseInt(masks[2]) << 8) | Integer.parseInt(masks[3]);
 5         mask = ~mask + 1;
 6          if((mask & (mask - 1)) == 0) {
 7              return true;
 8         }else {
 9             return false;
10         }
11     }
12 
13 //是否是有效的IP地址
14  public boolean IsIpv4(String ipv4) {
15         if (ipv4 == null || ipv4.length() == 0) {
16             return false;
17         }
18         String[] parts = ipv4.split("\\.");
19         if (parts.length != 4) {
20             return false;
21         }
22         for (int i = 0; i < parts.length; ++i) {
23             try {
24                 int n = Integer.parseInt(parts[i]);
25                 if (n >= 0 && n <= 255) continue;
26                 return false;
27             }
28             catch (NumberFormatException e) {
29                 return false;
30             }
31         }
32         return true;
33     }

二、根據IP與子網掩碼獲取網絡號和廣播地址

網絡號:子網掩碼與IP相與,這里的實現方法是分成了四段,每段&后轉成10進制就是網絡號

廣播號:子網掩碼取反,然后將其與網絡號取|

注意:

  • java中int占32位,如果我們的值沒有32位,高位就會用0來填充,如果取反,切記要去除高位(本文用了 XX&0xFF的方法)
  • ">>"與 ”>>>“的區分

 Java實現:

 1 //根據IP與掩碼獲取網絡號(環回地址)和廣播地址
 2   private Map<String, String> getNetwork(String address, String netmask) {
 3           Map<String, String> map = new HashMap<String, String>();
 4           String network = new String();
 5           String broadcast = new String();
 6           String[] addresses = address.split("\\.");
 7           String[] masks = netmask.split("\\.");
 8            for(int i = 0; i < 4; i++) {
 9              int opmasksegement = ~Integer.parseInt(masks[i]) & 0xFF;
10         //此處有坑,正常的int有32位,如果此數沒有32位的話,就會用0填充前面的數,從而導致取反0的部分會用1來填充,用上述方法可以獲取想要的部分
11              int netsegment = Integer.parseInt(addresses[i]) & Integer.parseInt(masks[i]);
12              network = network + String.valueOf(netsegment) + ".";
13              broadcast = broadcast + String.valueOf(opmasksegement | netsegment) + ".";
14           }
15           map.put("network", network.substring(0, network.length() - 1));
16           map.put("broadcast", broadcast.substring(0, broadcast.length() - 1));
17          return map;
18      }  

三、判斷IP是否在某個網段中

將IP與掩碼相與,如果其與網絡號相同,則返回true

 1 //判斷IP是否在某個網段內
 2 private boolean isInRange(String ip, String netmask, String network) {
 3         String[] ips = ip.split("\\.");  
 4         int ipAddr = (Integer.parseInt(ips[0]) << 24) | (Integer.parseInt(ips[1]) << 16) | (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]); 
 5         String[] masks = netmask.split("\\.");
 6         int mask = (Integer.parseInt(masks[0]) << 24) | (Integer.parseInt(masks[1]) << 16) | (Integer.parseInt(masks[2]) << 8) | Integer.parseInt(masks[3]);
 7         String[] networks =network.split("\\.");
 8         int net = (Integer.parseInt(networks[0]) << 24) | (Integer.parseInt(networks[1]) << 16) | (Integer.parseInt(networks[2]) << 8) | Integer.parseInt(networks[3]);
 9         return (ipAddr & mask) == net;
10     }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM