Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.21;
Скачать: CL | DM;

Вниз

сортировка IP адресов и не только....   Найти похожие ветки 

 
Digitman ©   (2002-01-25 13:18) [7]


uses WinSock;

type
EIPSpellCheckError = class(Exception);

const
IllegalIP = "Недопустимое строковое представление адреса : %s";

function ParseIp(Address: String; InAddr: PInAddr): Boolean;
var
PartNum, PartValue, PartCharNum, DelimiterCount: Integer;
psrc: PChar;
pdst: PByteArray;
NextChar: Char;
begin
Result:= False;
InAddr.S_addr:= 0;
PartNum:= 0;
PartCharNum:= 0;
PartValue:= 0;
DelimiterCount:= 0;
Address:= Trim(Address);
psrc:= PChar(Address);
pdst:= PByteArray(InAddr);
while psrc^ <> #0 do begin
NextChar:= psrc^;
case NextChar of
"0".."9":
if PartNum <= 4 then
if PartCharNum < 3 then begin
if DelimiterCount > 0 then
DelimiterCount:= 0
else if PartNum = 0 then
Inc(PartNum);
Inc(PartCharNum);
PartValue:= PartValue * 10 + byte(NextChar) - byte("0");
if PartValue > 255 then
Exit;
end else
Exit
else
exit;
".":
if DelimiterCount = 0 then
if PartNum > 0 then begin
pdst[PartNum - 1]:= Byte(PartValue);
PartValue:= 0;
Inc(PartNum);
PartCharNum:= 0;
PartValue:= 0;
Inc(DelimiterCount);
end else
Exit
else
Exit;
else
Exit;
end;
Inc(psrc);
end;
if PartNum > 0 then begin
if DelimiterCount = 0 then
pdst[PartNum - 1]:= Byte(PartValue);
Result:= True;
end;
end;


function CompareAddresses(List: TStringList; Index1, Index2: Integer): Integer;
var
InAddr: TInAddr;
Addr1, Addr2: DWord;
begin
if ParseIp(List[Index1], @inaddr) then
Addr1:= ntohl(InAddr.S_addr)
else
raise EIPSpellCheckError.CreateFmt(IllegalIP, [List[Index1]]);
if ParseIp(List[Index2], @inaddr) then
Addr2:= ntohl(InAddr.S_addr)
else
raise EIPSpellCheckError.CreateFmt(IllegalIP, [List[Index2]]);
if Addr1 > Addr2 then
Result:= 1
else if Addr1 < Addr2 then
Result:= -1
else
Result:= 0
end;

procedure Test;
var
AddrList: TStringList;
i, k: Integer;
s: string;
begin
AddrList:= TStringList.Create;
try
for i:= 0 to 9 do begin
s:= "";
for k:= 1 to Random(4) + 1 do
s:= s + IntToStr(Random(256)) + ".";
AddrList.Add(s);
end;
AddrList.CustomSort(@CompareAddresses);
s:= "";
for i:= 0 to AddrList.Count - 1 do
s:= s + AddrList[i] + #10;
ShowMessage(s);
finally
AddrList.Free;
end;
end;



Вызови процедуру Test(), она сгенерирует список из десятка строк, имитирующих список неких произвольных заданных тобой IP-адресов (в указанном тобой формате), отсортирует их и выведет окно с результатами сортировки



Страницы: 1 вся ветка

Текущий архив: 2002.02.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.011 c
1-66601
DenKop
2002-02-05 20:08
2002.02.21
Как отобрзить апостроф в переменной типа String


3-66442
XX
2002-01-27 12:28
2002.02.21
как сделать поиск по DBGRID?


7-66694
Scoj
2001-11-16 14:37
2002.02.21
Вопрос по реестру


7-66688
VG
2001-11-16 13:12
2002.02.21
Помогите поставить ловушку на Hint


1-66555
Ura
2002-02-05 11:49
2002.02.21
Убить поток