有時候我們需要判斷某乙個ip位址是否屬於乙個網段,以決定該使用者能否訪問系統.
比如使用者登入的ip是218.6.7.7,而我們的程式必須判斷他是否屬於218.6.0.0/16這個網段(其中/16是新的子網掩碼的表示方式,相當於255.255.0.0).
要實現這樣的功能,現在流行的演算法是將218.6.0.0和218.6.7.7按256進製換算成10進製並進行比較得出,如先計算出218.6.0.0和218.6.255.255的十進位制:218×256×256×256+6×256×256=3657826304,218×256×256×256+6×256×256+255×256×256+255=3657891839。再計算出218.6.7.7的十進:218×256×256×256+6×256×256+7×256+7=3657828103,最後再比較3657828103是否大於等於3657826304和小於等於3657891839。但明顯有乙個問題,計算量非常多,值非常大,如果ip位址是61開頭的還好,如果是218開頭的,這將會造成資料溢位而出錯。
其實比較ip是否屬於某一網段,最好的方式就是將ip與網段分別轉為32位二進位制,再比較他們的網路部分是否相同就可以了.asp本身不具備位執行功能,所以要實現這個只有我們手工實現,具體如下:
'將十進位制轉為二進位制字串
function dec2bin(octnumber)
vara=octnumber
do dec2bin=cstr(vara mod 2) & dec2bin
vara=vara \ 2
loop until vara=0
end function
'將二進位制字串填充為8位
function pad(str)
pad=right("00000000" & str,8)
end function
'判斷是否是乙個ip位址
function isip(ipadd)
isip=false
set oreg=new regexp
oreg.ignorecase=true
oreg.global=true
oreg.pattern="(\d\.\d\.\d\.\d)|(\d\.\d\.\d\.\d\/\d)"
if oreg.test(ipadd) then isip=true
set oreg=nothing
end function
'其中userip是我們要檢測的ip
'netip是要檢測的網段或某個ip,用***.***.***.***/n來表示網段,其中n表示子網掩碼位數
'程式設計:環球萬維,專業提供網域名稱註冊,虛擬主機服務
'**:[url]
function check_ip(userip,netip)
currentip=userip
collection_ips=split(iplist,",") '將網路按點分割成4段
check_ip=false '初始函式值,false假設ip不在這網段
netip=trim(netip)
slashpos=instr(netip,"/")
if slashpos=0 then '網段沒含有/符號,他只是乙個ip,所以比較比個字串是否相同就可以了
if netip=currentip then
check_ip=true 'check_ip=true表示ip相等
exit function
end if
else
netrang=mid(netip,slashpos+1) '得到/後邊的數字
if not isnumeric(netrang) then '/後邊不是數字,格式不正確
exit function
end if
netrang=cint(netrang) '將字元轉為數字
if netrang>31 then
exit function '/後的數字不能超過32位
end if
ipsets=split(currentip,".") '將使用者ip按點分成四段
c_ip_bin=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(dec2bin(ipsets(3)))
'上邊這行是將使用者ip位址手工轉換為對應的乙個32個字元長的二進位制
ipsets=split(netip,".") '按上邊的過程將網段ip同樣轉為32個字元長的二進位制
spos=instr(ipsets(3),"/") '最後一點格式應該是 數字/數字
if spos=0 then
exit function
end if
ipsets(3)=left(ipsets(3),spos-1) '得到最後一段/前邊的數字
s_ip_bin=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(dec2bin(ipsets(3)))
'將其轉換為32個字元長的二進位制
if left(c_ip_bin,netrang) = left(s_ip_bin,netrang) then '比較網段絡是否相同就可以判斷使用者ip否屬於某個網段了
check_ip=true
end if
end if
end function
應用舉例:
要判斷61.139.1.1是否在61.139.0.0/16 (255.255.0.0)這個網段
只需要簡單的使用這個函式就可以了,如:
if check_ip("61.139.1.1","61.139.0.0/16") then
response.write "同一網段"
else
response.write "不是同一網段"
end if
判斷陣列是否存在某元素
查詢乙個元素是否在陣列中,一共有上面三種做法 in array 函式在陣列中搜尋給定的值。in array value,array,type type 可選。如果設定該引數為 true,則檢查搜尋的資料與陣列的值的型別是否相同。array key exists array key exists 函式...
Numpy判斷某維度是否相同
在語義分割 semantic segmentation 領域深度學習的label預處理工作中,要把3通道的label資料轉為單通道的mask作為訓練樣本。例如把一堆黑色和紅色的畫素,轉為全是0和1的單通道 mask。最normal的處理流程為 判斷畫素的顏色 根據顏色賦值對應的label。那麼在步驟...
如何檢測某IP埠是否開啟
1 如果你直接到控制面板的管理工具裡的服務項裡去找telnet的話,那是徒勞無功 的,因為預設根本就沒有這一服務。當然,你可以通過如下方式搞定。控制面 板 一 程式 一 開啟或關閉windows功能 在裡面你可以看到許多服務項,選 擇 telnet伺服器 和 telnet客戶端 確定即可。這樣你再回...