Java驗證IP位址是否屬於指定區域網網段

2021-08-09 15:50:16 字數 4002 閱讀 1644

1、子網的主要作用就是為了減少ip的浪費
2、子網掩碼的作用,通過ip位址的二進位制與子網掩碼的二進位制進行與運算,來確定某個裝置的網路位址和主機號。子網掩碼設定了之後,可以固定主機位址和網路位址。我們經常看到的子網掩碼255.255.255.0,是由二進位制數轉換來的並通過二進位制數進行計算。
首先要清楚劃分的子網數目,以及每個子網內所需要的主機數目。

1)、將子網數目轉化為二進位制來表示

2)、取得該二進位制的位數,為n

3)、取得該ip位址的類子網掩碼,將其主機位址部分的前n位置1即得出該ip位址劃分的子網掩碼。

如將b類ip位址168.195.0.0劃分為27個子網

27轉化二進位制數為11011

該二進位制為五位數,n=5

將b類位址的子網掩碼255.255.0.0的主機位址前5位置1,得到255.255.248.0,即為劃分成27個子網的b類位址168.195.0.0的子網掩碼

1)、將主機地數目轉化為二進位制來表示

2)、如果主機數小於或等於254(注意去掉保留的兩個ip位址),則取得該主機的二進位制位數,為 n,這裡肯定n<8。如果大於254,則 n>8,這就是說主機位址將佔據不止8位。

3)、使用255.255.255.255來將該類ip位址的主機位址位數全部置1,然後從後向前的將n位全部置為 0,即為子網掩碼值。

700=1010111100 

該二進位制為十位數,n = 10 

將該b類位址的子網掩碼255.255.0.0的主機位址全部置1,得到255.255.255.255 然後再從後向前將後10位置0,即為: 11111111.11111111.11111100.00000000 

即255.255.252.0。這就是劃分成主機為700臺的b類ip位址168.195.0.0的子網掩碼。

現有子網ip位址192.168.0.1 ,子網掩碼255.255.255.0,需要驗證10.10.1.15是否屬於同一區域網網段。

首先通過此方法分別獲取子網ip位址和子網掩碼的二進位制數。

public string getbinarynumber(string address)

}else

} return sb.tostring();

}public string getbinarynumber(string address)

}else

} return sb.tostring();

}

得到結果為:

string networkaddress = "11000000101010000000000000000001";

string subnetmask = "11111111111111111111111100000000";

接下來要得到子網掩碼設定的ip範圍:

計算方式:

string zero = "" , one = "" ;

int i = 1;

//i為掩碼二進位制數中1的長度+1

for (;i <= subnetmask.length(); i++)

} for (int j = 0; j < 32-i; j++)

//將子網ip位址的二進位製碼進行擷取拼接

string startnetworkaddress = networkaddress.substring(0,i) + zero;

string endnetworkaddress = networkaddress.substring(0,i) + one;string zero = "" , one = "" ;

int i = 1;

//i為掩碼二進位制數中1的長度+1

for (;i <= subnetmask.length(); i++)

} for (int j = 0; j < 32-i; j++)

//將子網ip位址的二進位製碼進行擷取拼接

string startnetworkaddress = networkaddress.substring(0,i) + zero;

string endnetworkaddress = networkaddress.substring(0,i) + one;

startnetworkaddress = "11000000101010000000000000000000";

endnetworkaddress = "11000000101010000000000001111111";

將二進位制數轉化為ip位址

public string getdecimalismbybinary(string address)

return str.substring(0,str.length()-1);

}

現在將組裝好的引數傳入到方法中進行比較。

192.168.0.0-192.168.0.127,10.10.1.15

/**

* * @param ipsection 有效ip範圍,如192.168.0.0-192.168.0.127

* @param ip 需要驗證的ip位址

* @return

*/public static boolean ipisvalid(string ipsection, string ip) |[1-9]\\d|\\d)\\.)(25[0-5]|2[0-4]\\d|1\\d|[1-9]\\d|\\d)";

final string regx_ipb = regx_ip + "\\-" + regx_ip;

if (!ipsection.matches(regx_ipb) || !ip.matches(regx_ip))

return false;

int idx = ipsection.indexof('-');

string sips = ipsection.substring(0, idx).split("\\.");

string sipe = ipsection.substring(idx + 1).split("\\.");

string sipt = ip.split("\\.");

long ips = 0l, ipe = 0l, ipt = 0l;

for (int i = 0; i < 4; ++i)

if (ips > ipe)

return ips <= ipt && ipt <= ipe;

}/**

* * @param ipsection 有效ip範圍,如192.168.0.0-192.168.0.127

* @param ip 需要驗證的ip位址

* @return

*/public static boolean ipisvalid(string ipsection, string ip) |[1-9]\\d|\\d)\\.)(25[0-5]|2[0-4]\\d|1\\d|[1-9]\\d|\\d)";

final string regx_ipb = regx_ip + "\\-" + regx_ip;

if (!ipsection.matches(regx_ipb) || !ip.matches(regx_ip))

return false;

int idx = ipsection.indexof('-');

string sips = ipsection.substring(0, idx).split("\\.");

string sipe = ipsection.substring(idx + 1).split("\\.");

string sipt = ip.split("\\.");

long ips = 0l, ipe = 0l, ipt = 0l;

for (int i = 0; i < 4; ++i)

if (ips > ipe)

return ips <= ipt && ipt <= ipe;

}

最後根據方法返回值得到ip位址是否在指定的網段內。

驗證IP位址

編寫乙個函式來驗證輸入的字串是否是有效的 ipv4 或 ipv6 位址 ipv4 位址由十進位制數和點來表示,每個位址包含4個十進位制數,其範圍為 0 255,用 分割。比如,172.16.254.1 同時,ipv4 位址內的數不會以 0 開頭。比如,位址 172.16.254.01 是不合法的。i...

468 驗證IP位址

編寫乙個函式來驗證輸入的字串是否是有效的 ipv4 或 ipv6 位址。ipv4位址由十進位制數和點來表示,每個位址包含4個十進位制數,其範圍為 0 255,用 分割。比如,172.16.254.1 同時,ipv4 位址內的數不會以 0 開頭。比如,位址172.16.254.01是不合法的。ipv6...

LeetCode 驗證IP位址

ipv4 位址由十進位制數和點來表示,每個位址包含4個十進位制數,其範圍為 0 255,用 分割。比如,172.16.254.1 同時,ipv4 位址內的數不會以 0 開頭。比如,位址 172.16.254.01 是不合法的。ipv6 位址由8組16進製制的數字來表示,每組表示 16 位元。這些組數...