Форум: "Базы";
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];
Внизсортировка 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c