📄 untmyip.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 + -