[java]根据ip和掩码计算网段、广播地址及可用ip地址范围

亦凉 2022-10-19 13:59 475阅读 0赞

ip地址与掩码、网段、广播地址、可用ip范围

  • IP: 网络地址
  • 掩码: 指明一个IP地址的哪些位标识的是主机所在的子网。
  • 网段:网络中可通信的部分,一般用子网第一个地址表示。
  • 广播地址:专门用于同时向网络中所有工作站进行发送的一个地址;一般用子网最后一个地址表示。
  • 可用子网ip:一般指子网中去除网段、广播地址的地址范围
    参考资料:
    在这里插入图片描述

子网划分
完整代码:

  1. import java.util.HashMap;
  2. public class IpUtil {
  3. /** * 在main方法里面可以测试下 * 主要功能都在main方法里,需要什么自己找 */
  4. public static void main(String[] args) {
  5. String ip="192.168.1.21";//ip
  6. String mask="255.255.254.0";//位数,如果只知道子网掩码不知道位数的话在参考getMaskMap()方法
  7. NetInfo info = new NetInfo(ip,mask);
  8. System.out.println("ip:"+info.getIp());
  9. System.out.println("mask:"+info.getMask());
  10. System.out.println("broadcase:"+info.getBroadcast());
  11. System.out.println("segment:"+info.getSegment());
  12. System.out.println("startip:"+info.getStartIp());
  13. System.out.println("endIP:"+info.getEndIp());
  14. System.out.println("count:"+info.getCount());
  15. // System.out.println(getIpFromLong(getNetStartIp(ip,mask)));
  16. }
  17. /** * 输出二进制 * @param n */
  18. public static void binaryToDecimal(long n){
  19. for(int i = 63;i >= 0; i--) {
  20. System.out.print(n >>> i & 1);
  21. }
  22. System.out.println("---->");
  23. }
  24. /** * 把xx.xx.xx.xx类型的转为long类型的 * * @param ip * @return */
  25. public static Long getIpFromString(String ip)
  26. {
  27. // 进制 2^8 = 256 共四段
  28. Long ipLong = 0L;
  29. String ipTemp = ip;
  30. ipLong = ipLong * 256
  31. + Long.parseLong(ipTemp.substring(0, ipTemp.indexOf('.')));
  32. ipTemp = ipTemp.substring(ipTemp.indexOf('.') + 1, ipTemp.length());
  33. ipLong = ipLong * 256
  34. + Long.parseLong(ipTemp.substring(0, ipTemp.indexOf('.')));
  35. ipTemp = ipTemp.substring(ipTemp.indexOf(".") + 1, ipTemp.length());
  36. ipLong = ipLong * 256
  37. + Long.parseLong(ipTemp.substring(0, ipTemp.indexOf('.')));
  38. ipTemp = ipTemp.substring(ipTemp.indexOf('.') + 1, ipTemp.length());
  39. ipLong = ipLong * 256 + Long.parseLong(ipTemp);
  40. return ipLong;
  41. }
  42. /** * 把long类型的Ip转为一般Ip类型:xx.xx.xx.xx * * @param ip * @return */
  43. public static String getIpFromLong(Long ip)
  44. {
  45. String s1 = String.valueOf((ip & 4278190080L) / 16777216L); // 255.0.0.0 ~ 1.0.0.0 截取第一个八位
  46. String s2 = String.valueOf((ip & 16711680L) / 65536L); // 0.255.0.0 ~ 0.1.0.0 截取第二个八位
  47. String s3 = String.valueOf((ip & 65280L) / 256L); // 0.0.255.0 ~ 0.0.1.0 截取第三个八位
  48. String s4 = String.valueOf(ip & 255L); // 0.0.0.255 ~ 0.0.0.1 截取第四个八位
  49. return s1 + "." + s2 + "." + s3 + "." + s4;
  50. }
  51. public static class NetInfo{
  52. private static final long VALIDATE_DATA = Long.MAX_VALUE>>31;
  53. private static final HashMap<Integer,String> NET_MASK = new HashMap<>();
  54. private static String IP_REGEX = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
  55. + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." +"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
  56. + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
  57. // ip
  58. private String ipStr;
  59. private Long ip;
  60. // 掩码
  61. private String maskStr;
  62. private Long mask;
  63. // 网段
  64. private String segmentStr;
  65. private Long segment;
  66. // 广播地址
  67. private String broadcastStr;
  68. private Long broadcast;
  69. // 开始ip
  70. private String startIpStr;
  71. private Long startIp;
  72. // 结束ip
  73. private String endIpStr;
  74. private Long endIp;
  75. // 可用ip数
  76. private Long count;
  77. // 初始化掩码
  78. static{
  79. NET_MASK.put(32,getIpFromLong(VALIDATE_DATA));
  80. for(int i=1;i<32;i++) {
  81. NET_MASK.put(32-i,getIpFromLong(VALIDATE_DATA << i & VALIDATE_DATA));
  82. }
  83. }
  84. public NetInfo(String ipStr, String maskStr) {
  85. this.ipStr = ipStr;
  86. this.maskStr = maskStr;
  87. checkParam();
  88. init();
  89. }
  90. public NetInfo(String ipStr, int mask) {
  91. this(ipStr,NET_MASK.get(mask));
  92. }
  93. public void checkParam(){
  94. if(maskStr == null
  95. || "".equals(maskStr.trim())
  96. || !NET_MASK.containsValue(maskStr)){
  97. throw new RuntimeException("掩码无效");
  98. }
  99. if(ipStr == null || "".equals(ipStr.trim())){
  100. throw new RuntimeException("ip地址为空");
  101. }
  102. // 判断ip地址是否与正则表达式匹配
  103. if (!ipStr.matches(IP_REGEX)) {
  104. throw new RuntimeException("IP地址不合规范");
  105. }
  106. }
  107. public void init(){
  108. this.ip = getIpFromString(ipStr);
  109. this.mask = getIpFromString(maskStr);
  110. // 网段 = ip & 掩码
  111. this.segment = this.ip & this.mask;
  112. this.segmentStr = getIpFromLong(this.segment);
  113. // 广播地址 网段末尾用1补齐
  114. this.broadcast = this.segment | (~this.mask & VALIDATE_DATA);
  115. binaryToDecimal(broadcast);
  116. this.broadcastStr = getIpFromLong(this.broadcast);
  117. // 开始地址 网段+1
  118. this.startIp = this.segment +1;
  119. this.startIpStr = getIpFromLong(this.startIp);
  120. // 结束地址 广播地址-1
  121. this.endIp = this.broadcast -1;
  122. this.endIpStr = getIpFromLong(this.endIp);
  123. /*for( long i = startIp;i< endIp;i++){ System.out.println(getIpFromLong(i + 1)); }*/
  124. this.count = this.broadcast - this.startIp;
  125. }
  126. public String getIp() {
  127. return ipStr;
  128. }
  129. public String getMask() {
  130. return maskStr;
  131. }
  132. public String getSegment() {
  133. return segmentStr;
  134. }
  135. public String getBroadcast() {
  136. return broadcastStr;
  137. }
  138. public String getStartIp() {
  139. return startIpStr;
  140. }
  141. public String getEndIp() {
  142. return endIpStr;
  143. }
  144. public Long getCount() {
  145. return count;
  146. }
  147. }
  148. }

发表评论

表情:
评论列表 (有 0 条评论,475人围观)

还没有评论,来说两句吧...

相关阅读