当我收集来自用户的input时,如何检查是否是IP地址?
一个IP地址(假设你的意思是IPv4)实际上是一个整数,但通常写成四个由a分隔的数字.
。 每个数字表示整数的字节值,所以每个数字应该是0到255之间的数字(包括)。
function CheckIP(Input: String): Cardinal; var IP: Cardinal; i : Integer; Part: Integer; PartValue: Cardinal; PartValid: Boolean; begin Part := 3; PartValue := 0; PartValid := False; IP := 0; { When a '.' is encountered, the previous part is processed. Force processing } { the last part by adding a '.' to the input. } Input := Input + '.'; for i := 1 to Length(Input) do begin { Check next character } if Input[i] = '.' then begin if PartValue <= 255 then begin if PartValid then begin { A valid part is encountered. Put it in the result. } IP := IP or (PartValue shl (Part * 8)); { Stop processing if this is the last '.' we put in ourselves. } if i = Length(Input) then Break; { Else reset the temporary values. } PartValid := False; PartValue := 0; Dec(Part); end else RaiseException('Empty part'); end else RaiseException('Part not within 0..255'); end else if ((Input[i] >= '0') and (Input[i] <= '9')) then begin { A digit is found. Add it to the current part. } PartValue := PartValue * 10 + Cardinal((Ord(Input[i]) - Ord('0'))); PartValid := True; end else begin { Any other character raises an exception } RaiseException('Invalid character'); end; { If part < 0, we processed too many dots. } if Part < 0 then RaiseException('Too many dots'); end; { Check if we found enough parts. } if Part > 0 then RaiseException('Address most consist of 4 numbers'); { If Part is not valid after the loop, the input ended in a dot. } if not PartValid then RaiseException('IP cannot end in a dot'); { Return the calculated IP address as a cardinal. } Result := IP; end;
我修改了代码,现在可以在Inno setup中使用它:
//Validate an IPv4 address function ValidateIP( Input: String ): Boolean; var InputTemp : String; IP: Cardinal; i : Integer; Part: Integer; PartValue: Cardinal; PartValid: Boolean; begin InputTemp := Input; Result := True; Part := 3; PartValue := 0; PartValid := False; IP := 0; // When a '.' is encountered, the previous part is processed. Force processing // the last part by adding a '.' to the input. Input := Input + '.'; for i := 1 to Length(Input) do begin // Check next character if Input[i] = '.' then begin if PartValue <= 255 then begin if PartValid then begin // A valid part is encountered. Put it in the result. IP := IP or (PartValue shl (Part * 8)); // Stop processing if this is the last '.' we put in ourselves. if i = Length(Input) then Break; // Else reset the temporary values. PartValid := False; PartValue := 0; Dec(Part); end else Result := False; end else Result := False; end else if ( (((Ord(Input[i]) - Ord('0'))) >= 0) and ((Ord(Input[i]) - Ord('0')) <= 9) ) then begin // A digit is found. Add it to the current part. PartValue := PartValue * 10 + Cardinal((Ord(Input[i]) - Ord('0'))); PartValid := True; end else begin // Any other character Result := False; end; // If part < 0, we processed too many dots. if Part < 0 then Result := False; end; // Check if we found enough parts. if Part > 0 then Result := False; // If Part is not valid after the loop, the input ended in a dot. if not PartValid then Result := False; end;