⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 untmyip.pas

📁 在此unit中
💻 PAS
字号:
{===============================================================================
TMyIP
 Class with MyIP.dat - by bianbian (yuelinniao#hotmail.com)

   Status:  Freeware
 Compiler:  Delphi4, Delphi5, Delphi6, Delphi7
  Version:  1.0
 Lastdate:  2005-07-29
      Url:  http://spaces.msn.com/members/yuelinniao

   在此unit中,实现了对于QQ自定义IP数据库(MyIP.dat)的IP数据库的检索
===============================================================================}

unit untMyIP;

interface

uses
  SysUtils, Classes, Math, dialogs;

const
  _header = 193; //文件头偏移
  _startIP = 16; //开始ip的长度
  _endIP = 16;   //结束ip的长度
  _country = 14; //国家的长度
  _area = 47;    //地区的长度
  _thank = 13;   //感谢人的长度

type
  TMyIP = class(TObject)
    public
      constructor Create(cQQWryFileName: string);
      destructor Destroy; override;
      function GetIPAddress(IP: string): string;
    protected
      function GetIPValue(IP: string): Cardinal;
    private
      MyIPFileStream: TFileStream;
  end;

implementation

constructor TMyIP.Create(cQQWryFileName: string);
begin
  inherited Create;
  MyIPFileStream:=TFileStream.Create(cQQWryFileName, fmOpenRead or fmShareDenyWrite, 0);
end;

destructor TMyIP.Destroy;
begin
  MyIPFileStream.Free;
  inherited Destroy;
end;


///**
//* 给定一个IP地址,返回该项记录的信息
//* @param  IP  IP地址 string
//* @return 国家信息+地区信息  string
//*/
function TMyIP.GetIPAddress(IP: string): string;
  function SearchAddress(IPRecordFrom, IPValue: Cardinal): string;
  var
    strStartIP: string[_startIP];
    strEndIP: string[_endIP];
    CompareIPValue1, CompareIPValue2: Cardinal;
    strCountry: string[_country];
    strArea: string[_area];
  begin
    Result := '';
    MyIPFileStream.Seek(IPRecordFrom, soFromBeginning);

    MyIPFileStream.Read(strStartIP, _startIP);
    MyIPFileStream.Read(strEndIP, _endIP);
    try
      strStartIP[_startIP] := Chr(0);
      strEndIP[_endIP] := Chr(0);
    except
    end;

    CompareIPValue1 := GetIPValue(strStartIP);
    CompareIPValue2 := GetIPValue(strEndIP);

    //找到了
    if (IPValue >= CompareIPValue1) and (IPValue <= CompareIPValue2) then
    begin
      MyIPFileStream.Read(strCountry, _country);
      MyIPFileStream.Read(strArea, _area);
      Result := strArea; //这里只返回区域
    end
    else if (IPValue > CompareIPValue2) then //比大的还要大,查下一个
    begin
      IPRecordFrom := MyIPFileStream.Position + _country + _area + _thank;
      Result := SearchAddress(IPRecordFrom, IPValue);
    end;
  end;
begin
  Result := SearchAddress(_header, GetIPValue(IP));
end;

///**
//* 给定一个IP地址(四段点分字符串形式),返回该IP的数值
//* @param  IP  IP地址(四段点分字符串形式)  string
//* @return 该IP的数值  Cardinal
//*/
function TMyIP.GetIPValue(IP: string): Cardinal;
var
  tsIP: TStringlist;
  i: integer;
  function SplitStringToStringlist(aString: string; aSplitChar: string): TStringlist;
  begin
    Result:=TStringList.Create;
    while pos(aSplitChar, aString)>0 do begin
      Result.Add(copy(aString, 1, pos(aSplitChar, aString)-1));
      aString:=copy(aString, pos(aSplitChar, aString)+1, length(aString)-pos(aSplitChar, aString));
    end;
    Result.Add(aString);
  end;
begin
  tsIP:=SplitStringToStringlist(IP, '.');
  Result:=0;
  for i:=3 downto 0 do
  begin
      Result:=Result + StrToInt(tsIP[i]) * trunc(power(256, 3-i));
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -