发现自己对IP地址一窍不通。
当你的设备需要做网络,合理分配IP地址。
IP地址由二进制组成。32位 ip地址最终的范围:0.0.0.0到255.255.255.255
128 64 32 16 8 4 2 1
A类:1.0.0.1-126.255.255.254 默认掩码:255.0.0.0==/8
没有127 ,环回地址,自己的主机,如果能ping通,说明自己电脑的网卡是能用的
B类:128.0.0.1-191.255.255.254 默认掩码:255.255.0.0==/16
C类:192.0.0.1-223.255.255.254 默认掩码: 255.255.255.0==/24(1的个数)
ABC三种分类有37亿多个
子网掩码对于IP地址来说是必不可少的,作用是将IP地址规划为两个部分。
网络号 主机位
192.168.1. 1
255.255.255. 0 /24
子网掩码是连续的1:255 254 252 248 240 224 192 128
java根据IP及子网掩码获取IP段的工具包如下:
package com.interview; /** * Created by 79782 on 2018/6/23. */ public class IPUtil { public static String getNetMask(String mask) { int inetMask =Integer.parseInt(mask); if(inetMask > 32){ return null; } //子网掩码为1占了几个字节 int num1 = inetMask/8; //子网掩码的补位位数 int num2 = inetMask%8; int array[] = new int[4]; for (int i = 0; i < num1; i++) { array[i] = 255; } for (int i = num1; i < 4; i++) { array[i] = 0; } for (int i = 0; i < num2; num2--) { array[num1] += Math.pow(2, 8-num2); } String netMask = array[0] + "." + array[1] + "." + array[2] + "." + array[3]; return netMask; } public static String getLowAddr(String ipinfo, String netMask) { String lowAddr = ""; int ipArray[] = new int[4]; int netMaskArray[] = new int[4]; if(4 != ipinfo.split("\\.").length || "" == netMask){ return null; } for (int i = 0; i < 4; i++) { try{ ipArray[i] = Integer.parseInt(ipinfo.split("\\.")[i]); }catch(NumberFormatException e){ String ip = ipinfo.replaceAll("\n", ""); ipArray[i] = Integer.parseInt(ip.split("\\.")[i]); } netMaskArray[i] = Integer.parseInt(netMask.split("\\.")[i]); if(ipArray[i] > 255 || ipArray[i] < 0 || netMaskArray[i] > 255 || netMaskArray[i] < 0){ return null; } ipArray[i] = ipArray[i]&netMaskArray[i]; } //构造最小地址 for (int i = 0; i < 4; i++){ if(i == 3){ ipArray[i] = ipArray[i] + 1; } if ("" == lowAddr){ lowAddr +=ipArray[i]; } else{ lowAddr += "." + ipArray[i]; } } return lowAddr; } public static String getHighAddr(String ipinfo, String netMask) { String lowAddr = getLowAddr(ipinfo, netMask); int hostNumber = getHostNumber(netMask); if("" == lowAddr || hostNumber == 0){ return null; } int lowAddrArray[] = new int[4]; for (int i = 0; i < 4; i++) { lowAddrArray[i] = Integer.parseInt(lowAddr.split("\\.")[i]); if(i == 3){ lowAddrArray[i] = lowAddrArray[i] - 1; } } lowAddrArray[3] = lowAddrArray[3] + (hostNumber - 1); if(lowAddrArray[3] >255){ int k = lowAddrArray[3] / 256; lowAddrArray[3] = lowAddrArray[3] % 256; lowAddrArray[2] = lowAddrArray[2] + k; } if(lowAddrArray[2] > 255){ int j = lowAddrArray[2] / 256; lowAddrArray[2] = lowAddrArray[2] % 256; lowAddrArray[1] = lowAddrArray[1] + j; if(lowAddrArray[1] > 255){ int k = lowAddrArray[1] / 256; lowAddrArray[1] = lowAddrArray[1] % 256; lowAddrArray[0] = lowAddrArray[0] + k; } } String highAddr = ""; for(int i = 0; i < 4; i++){ if(i == 3){ lowAddrArray[i] = lowAddrArray[i] - 1; } if("" == highAddr){ highAddr = lowAddrArray[i]+""; }else{ highAddr += "." + lowAddrArray[i]; } } return highAddr; } public static int getHostNumber(String netMask) { int hostNumber = 0; int netMaskArray[] = new int[4]; for (int i = 0; i < 4 ; i++) { netMaskArray[i] = Integer.parseInt(netMask.split("\\.")[i]); if(netMaskArray[i] < 255){ hostNumber = (int) (Math.pow(256,3-i) * (256 - netMaskArray[i])); break; } } return hostNumber; } public static long ip2long(String ip) { String[] ips = ip.split("[.]"); long num = 16777216L * Long.parseLong(ips[0]) + 65536L * Long.parseLong(ips[1]) + 256 * Long.parseLong(ips[2]) + Long.parseLong(ips[3]); return num; } }