"двоеточие (':') ожидаемое" ошибка компилятора в диапазоне символов в операторе case в скрипте Inno Setup 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;

Кто-нибудь может определить мою ошибку?

1 ответ

Решение

Ansi-версия Inno Setup не поддерживает диапазоны в 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-й век, вы не должны больше разрабатывать приложения, не поддерживающие Юникод. См. Обновление от Ansi до Unicode-версии Inno Setup (любые недостатки).


Вам лучше использовать CryptStringToBinary Функция Windows API для преобразования шестнадцатеричного в двоичное в любом случае. Смотрите мой ответ на другой ваш вопрос. Написание двоичного файла в Inno Setup.


Обратите внимание, что в вашем коде много других проблем.

  • Вы вычитаете char от integer,
  • Настройка Inno не имеет перегрузки с двумя аргументами Inc,
  • TStream.WriteBuffer принимает stringне byte,
Другие вопросы по тегам