ja, die '0.0.0.0' hab ich glatt übersehn
Delphi-Quellcode:
function isIP(
const ipString:
String;
ip: PCardinal =
nil): Boolean;
var
pIpString: PChar;
octetCount, octetSum, octetLen, octet: Integer;
begin
Result := False;
pIpString := PChar(ipString);
octetCount := 0;
octetSum := 0;
while pIpString^ <> #0
do
begin
Inc(octetCount);
octetLen := 0;
octet := 0;
while pIpString^
in ['
0'..'
9']
do
//while IsDigit[pIpString^] do
begin
octet := octet * 10 + (Ord(pIpString^) - Ord('
0'));
Inc(octetLen);
Inc(pIpString);
end;
octetSum := octetSum
shl 8
or octet;
if (octetLen = 0)
or (octetLen > 3)
or (octet > 255)
then Exit;
if octetCount = 4
then Break;
if pIpString^ <> '
.'
then Exit;
Inc(pIpString);
end;
Result := (octetCount = 4)
and (octetSum <> 0)
and (pIpString^ = #0);
if Result
and Assigned(
ip)
then ip^ := octetSum;
end;
(Wie rum werden eigentlich die Werte ausgelesen? Nicht, daß hier die "
ip" in der falschen Bytefolge vorliegt)
Aber das mit der Lookuptabelle:
Bei Astats "Versuchsaufbau" brachte diese auch nur 0,2% Geschwindigkeitszuwachs,
dagegen werden ab D2009 64 KB mehr Speicher in den gloablen Variablen belegt.
Und da in einem Programm, wo man diese Funktion nutzt, bestimmt mehr anderer "langsamerer" Code ausgeführt wird, als durch diese Optimierung gewonnen wurde, fällt dieses fast garnicht auf.
> Man kann also diese Optimierung einbauen, aber merklich verbessern wird sich dadurch wohl nichts
Code:
Unit2.pas.50: while pIpString^ in ['0'..'9'] do
00461B5D 0FB730 movzx esi,[eax]
00461B60 8BCE mov ecx,esi
00461B62 83C1D0 add ecx,-$30
00461B65 6683E90A sub cx,$0a
00461B69 72E1 jb $00461b4c
Unit2.pas.51: while IsDigit[pIpString^] do
00461B59 0FB708 movzx ecx,[eax]
00461B5C 80B9A8B1460000 cmp byte ptr [ecx+$0046b1a8],$00
00461B63 75E6 jnz $00461b4b
PS:
[DCC Warnung] Unit2.pas(33): W1050 WideChar in Set-Ausdrücken auf ByteChar verkürzt. Ziehen Sie die Verwendung der Funktion 'CharInSet' aus der Unit 'SysUtils' in Betracht.
dieses kann man hier glatt ignorieren
PSS:
Delphi-Quellcode:
procedure InitIsDigit;
var
C : char;
begin
For C := '0' to '9' do IsDigit[C] := True;
end;
(die ganzen False werden ja durch die Initialisierung der Globalen gesetzt)