純真IP數據庫TQQWry的ASP讀取源碼(UTF-8編碼)

 

http://www.viming.com/newsshow_83.html

純真IP數據庫TQQWry的ASP讀取源碼(UTF-8編碼)


偉明網站設計 發佈於:2011-7-4 13:44:27  人氣指數:1679 人/次  字體:

  前些天我遇到了這樣的難題,在網上找的ASP讀取純真IP數據庫TQQWry的源碼是基於GB2312的。用在個人UTF-8的網站上,顯示出的地區是亂碼。後來經屢次研究驗證,終於寫出了基於UTF-8的ASP讀取TQQWry的源碼,爲此我還有點高興不以呢,嘿嘿。如今給你們分享一下,相信有不少朋友須要!javascript

如下是引用片斷:

' ============================================ ' 返回IP地區信息 ' ============================================ Function Look_Ip(IP)  Dim Wry, IPType, QQWryVersion, IpCounter  ' 設置類對象  Set Wry = New TQQWry  ' 開始搜索,並返回搜索結果  ' 您能夠根據 QQWry(IP) 返回值來判斷該IP地址在數據庫中是否存在,若是不存在能夠執行其餘的一些操做  ' 好比您自建一個數據庫做爲追捕等,這裏我就不詳細說明了  IPType = Wry.QQWry(IP)  ' Country:國家地區字段  ' LocalStr:省市及其餘信息字段  Look_Ip = Wry.Country & " " & Wry.LocalStr End Functionhtml

' ============================================ ' 返回QQWry信息 ' ============================================ Function WryInfo()  Dim Wry, IPType, QQWry(1)  ' 設置類對象  Set Wry = New TQQWry  IPType = Wry.QQWry("255.255.255.255")  ' 讀取數據庫版本信息  QQWry(0) = Wry.Country & " " & Wry.LocalStr  ' 讀取數據庫IP地址數目  QQWry(1) = Wry.RecordCount + 1  WryInfo = QQWry End Functionjava

' ============================================ ' IP物理定位搜索類 ' ============================================ Class TQQWry  ' ============================================  ' 變量聲名  ' ============================================  Dim Country, LocalStr, Buf, OffSet  Private StartIP, EndIP, CountryFlag  Public QQWryFile  Public FirstStartIP, LastStartIP, RecordCount  Private Stream, EndIPOff    ' ============================================  ' 類模塊初始化  ' ============================================  Private Sub Class_Initialize   Country = ""   LocalStr = ""   StartIP = 0   EndIP = 0   CountryFlag = 0   FirstStartIP = 0   LastStartIP = 0   EndIPOff = 0   QQWryFile = Server.MapPath("QQWry.dat") 'QQ IP庫路徑,要轉換成物理路徑  End Sub    ' ============================================  ' IP地址轉換成整數 ip   ' ============================================  Function IPToInt(IP)   If Instr(IP,":")>0 Then IP="127.0.0.1" ‘當IP地址是::1這樣的地址時返回本機地址   Dim IPArray, i   IPArray = Split(IP, ".", -1)   FOr i = 0 to 3   If Not IsNumeric(IPArray(i)) Then IPArray(i) = 0   If CInt(IPArray(i)) < 0 Then IPArray(i) = Abs(CInt(IPArray(i)))   If CInt(IPArray(i)) > 255 Then IPArray(i) = 255   Next   IPToInt = (CInt(IPArray(0))*256*256*256) + (CInt(IPArray(1))*256*256) + (CInt(IPArray(2))*256) + CInt(IPArray(3))  End Function    ' ============================================  ' 整數逆轉IP地址  ' ============================================  Function IntToIP(IntValue)   p4 = IntValue - Fix(IntValue/256)*256   IntValue = (IntValue-p4)/256   p3 = IntValue - Fix(IntValue/256)*256   IntValue = (IntValue-p3)/256   p2 = IntValue - Fix(IntValue/256)*256   IntValue = (IntValue - p2)/256   p1 = IntValue   IntToIP = Cstr(p1) & "." & Cstr(p2) & "." & Cstr(p3) & "." & Cstr(p4)  End Function    ' ============================================  ' 獲取開始IP位置  ' ============================================  Private Function GetStartIP(RecNo)   OffSet = FirstStartIP + RecNo * 7   Stream.Position = OffSet   Buf = Stream.Read(7)      EndIPOff = AscB(MidB(Buf, 5, 1)) + (AscB(MidB(Buf, 6, 1))*256) + (AscB(MidB(Buf, 7, 1))*256*256)   StartIP = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)   GetStartIP = StartIP  End Function    ' ============================================  ' 獲取結束IP位置  ' ============================================  Private Function GetEndIP()   Stream.Position = EndIPOff   Buf = Stream.Read(5)   EndIP = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)   CountryFlag = AscB(MidB(Buf, 5, 1))   GetEndIP = EndIP  End Function    ' ============================================  ' 獲取地域信息,包含國家和和省市  ' ============================================  Private Sub GetCountry(IP)   If (CountryFlag = 1 or CountryFlag = 2) Then   Country = GetFlagStr(EndIPOff + 4)   If CountryFlag = 1 Then   LocalStr = GetFlagStr(Stream.Position)   ' 如下用來獲取數據庫版本信息   If IP >= IPToInt("255.255.255.0") And IP <= IPToInt("255.255.255.255") Then   LocalStr = GetFlagStr(EndIPOff + 21)   Country = GetFlagStr(EndIPOff + 12)   End If   Else   LocalStr = GetFlagStr(EndIPOff + 8)   End If   Else   Country = GetFlagStr(EndIPOff + 4)   LocalStr = GetFlagStr(Stream.Position)   End If   ' 過濾數據庫中的無用信息   Country = Trim(Country)   LocalStr = Trim(LocalStr)   If InStr(Country, "CZ88.NET") Then Country = "本地/局域網"   If InStr(LocalStr, "CZ88.NET") Then LocalStr = "本地/局域網"  End Sub    ' ============================================  ' 獲取IP地址標識符  ' ============================================  Private Function GetFlagStr(OffSet)   Dim Flag   Flag = 0   Do While (True)   Stream.Position = OffSet   Flag = AscB(Stream.Read(1))   If(Flag = 1 or Flag = 2 ) Then   Buf = Stream.Read(3)   If (Flag = 2 ) Then   CountryFlag = 2   EndIPOff = OffSet - 4   End If   OffSet = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256)   Else   Exit Do   End If   Loop      If (OffSet < 12 ) Then   GetFlagStr = ""   Else   Stream.Position = OffSet   GetFlagStr = GetStr()   End If  End Function    ' ============================================  ' 獲取字串信息 (www.viming.com)  '-----utf-8-----------  Private Function GetStr()   dim c   getstr = ""   dim objstream   set objstream = server.createobject("adodb.stream")   objstream.type = 1   objstream.mode =3   objstream.open   c = stream.read(1)   do while (ascb(c)<>0 and not stream.eos)   objstream.write c   c = stream.read(1)   loop   objstream.position = 0   objstream.type = 2   objstream.charset = "gb2312"   getstr = objstream.readtext   objstream.close   set objstream = nothing  End Function    ' ============================================  ' 核心函數,執行IP搜索  ' ============================================  Public Function QQWry(DotIP)   Dim IP, nRet   Dim RangB, RangE, RecNo      IP = IPToInt (DotIP)      Set Stream = CreateObject("ADodb.Stream")   Stream.Mode = 3   Stream.Type = 1   Stream.Open   Stream.LoadFromFile QQWryFile   Stream.Position = 0   Buf = Stream.Read(8)      FirstStartIP = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)   LastStartIP = AscB(MidB(Buf, 5, 1)) + (AscB(MidB(Buf, 6, 1))*256) + (AscB(MidB(Buf, 7, 1))*256*256) + (AscB(MidB(Buf, 8, 1))*256*256*256)   RecordCount = Int((LastStartIP - FirstStartIP)/7)   ' 在數據庫中找不到任何IP地址   If (RecordCount <= 1) Then   Country = "未知"   QQWry = 2   Exit Function   End If      RangB = 0   RangE = RecordCount      Do While (RangB < (RangE - 1))   RecNo = Int((RangB + RangE)/2)   Call GetStartIP (RecNo)   If (IP = StartIP) Then   RangB = RecNo   Exit Do   End If   If (IP > StartIP) Then   RangB = RecNo   Else   RangE = RecNo   End If   Loop      Call GetStartIP(RangB)   Call GetEndIP()      If (StartIP <= IP) And ( EndIP >= IP) Then   ' 沒有找到   nRet = 0   Else   ' 正常   nRet = 3   End If   Call GetCountry(IP)      QQWry = nRet  End Function    ' ============================================  ' 類終結  ' ============================================  Private Sub Class_Terminate   On ErrOr Resume Next   Stream.Close   If Err Then Err.Clear   Set Stream = Nothing  End Sub End Class數據庫

 

  純真IP數據庫TQQWry的ASP讀取源碼(UTF-8編碼)調用方法:Look_Ip("123.123.123.123")vim

  以上代碼我還寫了一點小小的升級,就是當IP地址是::1這樣的地址時,返回本機地址,以避免發生錯誤。ssh

相關文章
相關標籤/搜索