ASP二进制十进制转换、IP转数字、数字转IP
发布时间:2013-03-02 13:33:24 访问次数:9286 【关闭此页】
有时候我们会在页面上显示用户的所在地区。这个原理是:先获取用户的IP,然后去数据库查询,再得到用户所在的地方。为了减少数据库开销,并不是每一个IP地址都对应一条数据记录,而是按范围划分,每一个范围的IP地址对应一条数据记录。为了便于查询比较,数据库通常是将IP字串转换成十进制数字再进行范围划分。这样在查询时,只要将用户的IP转换成数字,然后去查这个数字所在的范围,即可得到对应的地区记录。

根据TCP/IP协议规定,IP地址是由32位二进制数组成,而且在Internet范围内是唯一的。例如,某台联在因特网上的计算机的IP地址为:125.39.171.82,那么它的二进制数据就是01111101 00100111 10101011 01010010。将这四组八位的二进制数据结合在一起然后再转换成十进制数据即:2099751762,就是这个IP所对应的十进制数据了。
'检测字符串型IP和数值型IP格式是否正确
function checkStr(str,t)
checkStr=false
if str="" then exit function
dim RegEx
set RegEx=New regExp
select case t
case "IP"
RegEx.Pattern="^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$"
case "n"
RegEx.Pattern="^(\d|[1-9][\d]{1,9})$"
case else
set RegEx=nothing
exit function
end select
checkStr=regEx.test(str)
set RegEx=nothing
end function
'十进制转二进制
function D_B(byval d)
do
'D_B=d mod 2&D_B
'd=d\2
'mod取余和反斜杠取整运算遇到-2147483648到2147483647之外的数字会溢出,所以用下面两句代替。
D_B=d-fix(d/2)*2&D_B
d=fix(d/2)
loop while d
end function
'二进制转十进制
function B_D(b)
dim i
for i=1 to len(b)
B_D=B_D*2+mid(b,i,1)
next
end function
'字符串型IP转数值型IP
function IP_Number(IP)
if checkStr(IP,"IP")=false then exit function
dim arr,i,b
arr=split(IP,".")
for i=0 to ubound(arr)
b=b&right("0000000"&D_B(arr(i)),8)
next
IP_Number=B_D(b)
end function
'数值型IP转字符串型IP
function Number_IP(n)
if checkStr(n,"n")=false then exit function
if n>4294967295 then exit function
dim b
b=right("0000000000000000000000000000000"&D_B(n),32)
Number_IP=B_D(mid(b,1,8))&"."&B_D(mid(b,9,8))&"."&B_D(mid(b,17,8))&"."&B_D(mid(b,25,8))
end function
上面这种转换方式是按照思路十进制转二进制,然后分成四组再转为十进制这样一步一步来的,很是繁琐。下面分享一组简单的给大家,当然,上面那段检测IP格式的代码下面也得用到,我就不在下面贴了。
'字符串型IP转数值型IP function IPToNumber(IP) if checkStr(IP,"IP")=false then exit function dim arr arr=split(IP,".") IPToNumber=arr(0)*16777216+arr(1)*65536+arr(2)*256+arr(3) end function '数值型IP转字符串型IP function NumberToIP(n) if checkStr(n,"n")=false then exit function if n>4294967295 then exit function dim a,b,c,d a=fix(n/16777216) b=fix(n/65536-a*256) c=fix(n/256-a*65536-b*256) d=n-a*16777216-b*65536-c*256 NumberToIP=a&"."&b&"."&c&"."&d end function
