import org.junit.Test;
public class demo {
public static final String DEFAULT_SUBNET_MASK_A = "255.0.0.0";
public static final String DEFAULT_SUBNET_MASK_B = "255.255.0.0";
public static final String DEFAULT_SUBNET_MASK_C = "255.255.255.0";
public static final String TYPE_IP_A = "A";
public static final String TYPE_IP_B = "B";
public static final String TYPE_IP_C = "C";
public static final String TYPE_IP_D = "D";
public static final String TYPE_IP_LOCATE = "locate";
/**
* 比对两个IP是否在同一网段
* @param resourceIp
* @param requestIp
* @return
*/
public static boolean isSameAddress(String resourceIp, String requestIp) {
if (getIpType(resourceIp).equals(getIpType(requestIp))){
return isSameAddress(resourceIp,requestIp,getIpDefaultMask(getIpType(resourceIp)));
}
return false;
}
//通过ip类型,获取默认IP子网掩码
private static String getIpDefaultMask(String ipType){
switch (ipType){
case TYPE_IP_A:return DEFAULT_SUBNET_MASK_A;
case TYPE_IP_B:return DEFAULT_SUBNET_MASK_B;
case TYPE_IP_C:return DEFAULT_SUBNET_MASK_C;
default:
return "没有对应的mask地址";
}
}
public static boolean isSameAddress(String resourceIp, String requestIp, String subnetMask) {
String resourceAddr = getAddrIp(resourceIp, subnetMask);
String subnetMaskAddr = getAddrIp(requestIp, subnetMask);
if (resourceAddr.equals(subnetMaskAddr)) {
return true;
}
return false;
}
//获取ip的二进制字符串
private static String getBinaryIp(String data) {
String[] datas = data.split("\\.");
String binaryIp = "";
for (String ipStr : datas) {
long signIp = Long.parseLong(ipStr);
String binary = Long.toBinaryString(signIp);
long binaryInt = Long.parseLong(binary);
binaryIp += String.format("%08d", binaryInt);
}
return binaryIp;
}
//获取ip的地址位
private static String getAddrIp(String ip, String subnetMask) {
StringBuilder addrIp = new StringBuilder();
String binaryIp = getBinaryIp(ip);
String binarySubnetMask = getBinaryIp(subnetMask);
for (int i = 0; i < 32; i++) {
byte ipByte = Byte.parseByte(String.valueOf(binaryIp.charAt(i)));
byte subnetMaskByte = Byte.parseByte(String.valueOf(binarySubnetMask.charAt(i)));
addrIp.append(ipByte & subnetMaskByte);
}
return addrIp.toString();
}
/**
* 获取ip类型 A,B,C..
* @param ip
* @return
*/
public static String getIpType(String ip) {
String binaryIp = getBinaryIp(ip);
System.out.println(binaryIp);
if (ip.startsWith("127")){
return TYPE_IP_LOCATE;
}
if (binaryIp.startsWith("0")){
return TYPE_IP_A;
}
if (binaryIp.startsWith("10")){
return TYPE_IP_B;
}
if (binaryIp.startsWith("110")){
return TYPE_IP_C;
}
if (binaryIp.startsWith("1110")){
return TYPE_IP_D;
}
return "无效ip";
}
/**
*String类型ip转换成int类型
* @param ipOrMask
* @return
*/
public static int getIpV4Value(String ipOrMask)
{
byte[] addr = getIpV4Bytes(ipOrMask);
int address1 = addr[3] & 0xFF;
address1 |= ((addr[2] << 8) & 0xFF00);
address1 |= ((addr[1] << 16) & 0xFF0000);
address1 |= ((addr[0] << 24) & 0xFF000000);
return address1;
}
/**
* 根据ip获取字节数值
* @param ipOrMask
* @return
*/
public static byte[] getIpV4Bytes(String ipOrMask)
{
try
{
String[] addrs = ipOrMask.split("\\.");
int length = addrs.length;
byte[] addr = new byte[length];
for (int index = 0; index < length; index++)
{
addr[index] = (byte) (Integer.parseInt(addrs[index]) & 0xff);
}
return addr;
}
catch (Exception e)
{
}
return new byte[4];
}
/**
* int类型ip转换为String类型ip
* @param ipnum
* @return
*/
public static String getIpFromInt(int ipnum){
StringBuilder sb=new StringBuilder();
int num=0;
boolean needPoint=false;
for (int i = 0; i <4; i++) {
if(needPoint){
sb.append('.');
}
needPoint=true;
int offset=8*(3-i);
num =(ipnum >> offset)&0xff;
sb.append(num);
}
return sb.toString();
}
@Test
public void test() {
String ip_a="192.168.1.15";
String ip_c="192.168.1.1";
String binaryIp = getBinaryIp("192.168.1.1");
System.out.println(getIpType(ip_a));
System.out.println(isSameAddress(ip_a,ip_c));
}
}