![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение двух IP-адресов [D7, WinXP]
Артем К. © (2004-10-08 05:02:00)Здравствуйте, уважаемые мастера!
Как сравнить две строки, в которых находятся IP-адреса, т.е. нужно узнать какой IP-адрес больше.
Заранее спасибо!
Defunct (2004-10-08 20:35:00) [1]Вот функции, которые помогут в этом отношении.
This file is part of the Free Sockets Interface
Copyright (c) 1999 by Berczi Gabor ( e-mail: sting@freemail.hu )
type
TIPRec = packed record
Octets: array[1..4] of byte;
end;
Function FormatIP(IP: Cardinal): string;
Var S: string[20];
I: Cardinal;
Begin
S:='';
For I:=1 to 4 Do
Begin
If I<>1 Then S:=S+'.';
S:=S+Int2String(TIPRec(IP).Octets[I]);
End;
FormatIP:=S;
End;
Procedure SplitIP(IP: Cardinal; var B1,B2,B3,B4: byte);
Begin
With TIPRec(IP) Do
Begin
B1:=Octets[1];
B2:=Octets[2];
B3:=Octets[3];
B4:=Octets[4];
End;
End;
Function IP(B1,B2,B3,B4: byte): Cardinal;
Var L: Cardinal;
Begin
With TIPRec(L) do
Begin
Octets[1]:=B1;
Octets[2]:=B2;
Octets[3]:=B3;
Octets[4]:=B4;
End;
IP:=L;
End;
Function IPStr(IP: string): Cardinal;
Var Addr: TIPRec;
I,P: Cardinal;
Begin
For I:=1 To 4 Do
Begin
P:=Pos('.',IP);
if P=0 then P:=length(IP)+1;
Addr.Octets[I]:=String2Int(copy(IP,1,P-1));
Delete(IP,1,P);
End;
IPStr:=Cardinal(Addr);
end;
{
$Log: abisocks.pas,v $
Revision 1.0 1999/07/07 09:46:55 gabor
Original implementation
}
Klopan (2004-10-08 20:24:00) [2]вот функция преобразующая ip в hex
function IP2HEX(OrgIP:string):string;
var
// Сохраняем оригинальное значение IP адреса
OrgVal: string;
// части оригинального IP
O1,O2,O3,O4: string;
// шестнадцатиричные части
H1,H2,H3,H4: string;
// Здесь будут собраны все шестнадцатиричные части
HexIP: string;
XN: array[1..8] of Extended;
Flt1: Extended;
Xc: Integer;
begin
// Сохраняем в обратном порядке для простого случая
Xn[8]:=IntPower(16,0);Xn[7]:=IntPower(16,1); Xn[6]:=IntPower(16,2);Xn[5]:=IntPower(16,3);
Xn[4]:=IntPower(16,4);Xn[3]:=IntPower(16,5); Xn[2]:=IntPower(16,6);Xn[1]:=IntPower(16,7);
// Сохраняем оригинальный IP адрес
OrgVal:=OrgIP;
O1:=Copy(OrgVal,1,Pos('.',OrgVal)-1);Delete(OrgVal,1,Pos('.',OrgVal));
O2:=Copy(OrgVal,1,Pos('.',OrgVal)-1);Delete(OrgVal,1,Pos('.',OrgVal));
O3:=Copy(OrgVal,1,Pos('.',OrgVal)-1);Delete(OrgVal,1,Pos('.',OrgVal));
O4:=OrgVal;
H1:=IntToHex(StrToInt(O1),2);H2:=IntToHex(StrToInt(O2),2);
H3:=IntToHex(StrToInt(O3),2);H4:=IntToHex(StrToInt(O4),2);
// Получаем шестнадцатиричное значение IP адреса
HexIP:=H1+H2+H3+H4;
// Преобразуем это большое шестнадцатиричное значение в переменную Float
Flt1:=0;
for Xc:=1 to 8 do
begin
case HexIP[Xc] of
'0'..'9': Flt1:=Flt1+(StrToInt(HexIP[XC])*Xn[Xc]);
'A': Flt1:=Flt1+(10*Xn[Xc]);
'B': Flt1:=Flt1+(11*Xn[Xc]);
'C': Flt1:=Flt1+(12*Xn[Xc]);
'D': Flt1:=Flt1+(13*Xn[Xc]);
'E': Flt1:=Flt1+(14*Xn[Xc]);
'F': Flt1:=Flt1+(15*Xn[Xc]);
end;
end;
Result:=FloatToStr(Flt1);
end;
Verg (2004-10-08 05:33:00) [3]Учти, однако, что если часть(и) IP адреса заданы с лидирующим нулем, то считается, что они заданы в восьмиричной СС.
Так работает inet_addr
Артем К. (2004-10-08 05:29:00) [4]>>SammIk
если бы я сам мог это сделать, то не спрашивал бы. для того форумы и существуют :))
SammIk (2004-10-08 05:23:00) [5]Вот все надо разжувать!))
Verg (2004-10-08 05:22:00) [6]Если речь идет об IPv4, то
ntohl(inet_addr(pchar(IPString1))) <операция сравнения> ntohl(inet_addr(pchar(IPString2)))
SammIk (2004-10-08 05:22:00) [7]Переводишь в тип DWORD и сравниваешь
Ищи в мсдн, есть такая ф-я. Или сам напиши.
Артем К. (2004-10-08 05:17:00) [8]Понятно, что при помощи < и >
Например есть некоторые абстрактные адреса:
1.000.000.000 и 000.000.000.1
Как можно эти адреса сравнить, т.е. определить, что
1.000.000.000 > 000.000.000.1
Gero (2004-10-08 05:10:00) [9]<, >