Windows Inno安装脚本中的基本IP验证

Windows Inno安装脚本中的基本IP验证,windows,ip-address,inno-setup,pascalscript,Windows,Ip Address,Inno Setup,Pascalscript,当我从用户收集输入时,如何检查它是否是IP地址?IP地址(假设您指的是IPv4)实际上是一个整数,但它通常被写成四个数字,由分隔。这些数字中的每一个都代表整数的一个字节值,因此每一个数字都应该是一个介于0和255(包括)之间的数字 函数CheckIP(输入:字符串):基数; 变量 IP:红衣主教; i:整数; 部分:整数; PartValue:基数; 部分有效:布尔值; 开始 部分:=3; PartValue:=0; PartValid:=False; IP:=0; {遇到“.”时,将处理上一部

当我从用户收集输入时,如何检查它是否是IP地址?

IP地址(假设您指的是IPv4)实际上是一个整数,但它通常被写成四个数字,由
分隔。这些数字中的每一个都代表整数的一个字节值,因此每一个数字都应该是一个介于0和255(包括)之间的数字

函数CheckIP(输入:字符串):基数;
变量
IP:红衣主教;
i:整数;
部分:整数;
PartValue:基数;
部分有效:布尔值;
开始
部分:=3;
PartValue:=0;
PartValid:=False;
IP:=0;
{遇到“.”时,将处理上一部分。强制处理}
{最后一部分是在输入中添加“.”
输入:=输入+';
对于i:=1到长度(输入)do
开始
{检查下一个字符}
如果输入[i]='.',则
开始
如果PartValue='0')和(输入[i]0),则
RaiseException(“地址大多数由4个数字组成”);
{如果循环后零件无效,则输入以点结尾。}
如果无效,则
RaiseException(“IP不能以点结尾”);
{以基数形式返回计算的IP地址。}
结果:=IP;
结束;

我修改了代码,现在您可以将其与Inno设置一起使用:

//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;
//验证IPv4地址
函数验证IP(
输入:字符串
):布尔值;
变量
InputTemp:字符串;
IP:红衣主教;
i:整数;
部分:整数;
PartValue:基数;
部分有效:布尔值;
开始
InputTemp:=输入;
结果:=真;
部分:=3;
PartValue:=0;
PartValid:=False;
IP:=0;
//遇到“.”时,将处理上一个零件。强制处理
//最后一部分是在输入中添加“.”。
输入:=输入+';
对于i:=1到长度(输入)do
开始
//检查下一个字符
如果输入[i]='.',则
开始
如果PartValue=0)和((Ord(输入[i])-Ord('0'))0,则
结果:=假;
//如果循环后零件无效,则输入以点结束。
如果无效,则
结果:=假;
结束;

我知道这一点。我在用pascal问inno安装程序怎么做。我不知道这个inno安装脚本,所以我在Delphi中编写了一个函数,试图省去任何可能是Delphi特定的函数。该函数检查输入字符串并返回IP地址作为基数。如果发现错误,该函数将抛出异常。您可以使用结果进一步检查IP是否在特定范围内。如果此脚本不支持异常,则必须找到其他解决方案,例如使函数返回True或False,并在out参数中返回IP。对于Delphi,此代码将极其复杂,且效率低下(例如,没有必要逐字符循环)。@TLama是的,对于Delphi来说是这样。幸运的是,这不是Delphi的问题。:)伙计们,猜猜谁最知道如何在Windows上将字符串转换为IP地址?这是Winsock。它可以转换那些疯狂的点或非点八进制、十六进制和混合符号。虽然
RtlIpv4StringToAddress
函数会更好,但它是在Vista中添加的,因此我在我的应用程序中使用了
inet\u addr