"colon (':') expected" Inno 安装程序 Pascal 脚本中大小写语句中字符范围的编译器错误



我在这段代码上(第14行;第10列)遇到了一个"期望的冒号(:)"语法错误,我不知所措。这段代码在Inno-Setup编译器中运行,它类似于Delphi,但我不认为它是完整的Delphi。

Inno Setup版本为5.5.9(a),因此为Ansi版本。

procedure HexToBin(const Hex: string; Stream: TStream);
var
  B: Byte;
  C: Char;
  Idx, Len: Integer;
begin
  Len := Length(Hex);
  If Len = 0 then Exit;
  If (Len mod 2) <> 0 then RaiseException('bad hex length');
  Idx := 1;
  repeat
    C := Hex[Idx];
    case C of
      '0'..'9': B := Byte((Ord(C) - '0') shl 4);
      'A'..'F': B := Byte(((Ord(C) - 'A') + 10) shl 4);
      'a'..'f': B := Byte(((Ord(C) - 'a') + 10) shl 4);
    else
      RaiseException('bad hex data'); 
    end; 
    C := Hex[Idx+1];
    case C of
      '0'..'9': B := B or Byte(Ord(C) - '0');
      'A'..'F': B := B or Byte((Ord(C) - 'A') + 10);
      'a'..'f': B := B or Byte((Ord(C) - 'a') + 10);
    else
      RaiseException('bad hex data'); 
    end; 
    Stream.WriteBuffer(B, 1);
    Inc(Idx, 2);
  until Idx > Len;
end;
begin
  FStream := TFileStream.Create('myfile.jpg', fmCreate);
  HexToBin(myFileHex, FStream);
  FStream.Free;
end;

有人能发现我的错误吗?

Inno Setup的Ansi版本似乎不支持case语句中的范围。

所以你必须列举集合:

case C of
  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': B := ...;
  ...
end;

在什么情况下,最好使用if:

if (C >= '0') and (C <= '9') then

尽管更好,使用Inno Setup的Unicode版本。现在是21世纪,您不应该再开发非Unicode应用程序了。请参阅Inno Setup的从Ansi升级到Unicode版本(任何缺点)。而且Inno Setup 6只有Unicode版本。


无论如何,最好使用CryptStringToBinary Windows API函数进行十六进制到二进制的转换。请参阅我对您的另一个问题的回答在Inno Setup中编写二进制文件。


请注意,您的代码还有很多其他问题。

  • 您正在从integer中减去char
  • Inno Setup没有Inc的双参数重载
  • TStream.WriteBufferstring,而不是byte

相关内容

  • 没有找到相关文章

最新更新