2011-06-22 66 views

回答

5

IP地址(假设您的意思是IPv4)实际上是一个整数,但它通常写为四个数字,用.分隔。每个数字表示整数的字节值,因此每个数字应该是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; 
+0

我意识到这一点。我在帕斯卡问,如何做,为了inno的设置。 –

+0

我不知道这个Inno安装脚本,所以我在Delphi中编写了一个函数,并试图排除任何可能是特定Delphi的函数。该函数检查输入字符串并将IP地址作为红衣主教返回。如果发现错误,该函数将引发异常。您可以使用结果进行进一步检查,看看IP是否在特定范围内。如果此脚本不支持异常,则必须找到另一个解决方案,如使该函数返回True或False,并将IP返回到* out *参数中。 – GolezTrol

+0

对于Delphi来说,这段代码会非常复杂并且效率低下(不需要像char那样循环字符)。 – TLama

2

我修改了代码,现在你可以用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; 
+0

太好了,谢谢! – GolezTrol

+0

伙计们,猜猜谁最了解如何将字符串转换为Windows上的IP地址?这是Winsock。它可以转换那些疯狂的虚线或非虚线的八进制,十六进制和混合符号。尽管'RtlIpv4StringToAddress'函数会更好,它已经添加到Vista中,因此我在我的['linked code'](http://pastebin.com/wyPr923P)中使用了'inet_addr'。 – TLama

相关问题