ASP二进制十进制转换、IP转数字、数字转IP
发布时间:2013-03-02 13:33:24 访问次数:8721 【关闭此页】
有时候我们会在页面上显示用户的所在地区。这个原理是:先获取用户的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