Windows Inno安装脚本中的基本IP验证
当我从用户收集输入时,如何检查它是否是IP地址?IP地址(假设您指的是IPv4)实际上是一个整数,但它通常被写成四个数字,由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; {遇到“.”时,将处理上一部
分隔。这些数字中的每一个都代表整数的一个字节值,因此每一个数字都应该是一个介于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
。