2016-07-27 5 views
2

Я получаю синтаксическую ошибку «двоеточие (:) ожидаемое» для этого кода (строка 14; столбец 10) и Я в недоумении. Этот код работает в компиляторе Inno Setup, он похож на Delphi, но я не думаю, что он полный Delphi.«двоеточие (':') ожидается« ошибка компилятора в диапазоне символов в заявлении case в скрипте Inno Setup Pascal-скрипт

Версия 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; 

Может ли кто-нибудь указать мою ошибку?

+0

Обновлен с полным минимальным примером. –

+0

Единственная ошибка в этом коде, о которой говорил Мартин. –

+1

Версия ansi, похоже, не может анализировать диапазоны случаев. Либо используйте версию Unicode, либо расширьте диапазоны ('0', '1', ...). –

ответ

2

Версия 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 

Хотя еще лучше, использовать версию Unicode программы установки Inno. Это 21-й век, вам больше не нужно разрабатывать приложения, отличные от Unicode. См. Upgrading from Ansi to Unicode version of Inno Setup (any disadvantages).


Лучше использовать CryptStringToBinary Windows API function для шестнадцатеричного в двоичные преобразования в любом случае. См. Мой ответ на другой вопрос: Writing binary file in Inno Setup.


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

  • Вычитание char от integer.
  • У Inno Setup нет двух аргументов перегрузки Inc.
  • TStream.WriteBufferstring, а не byte.