Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Оператор case не работает с большими числами?

#delphi


Я определяю типы графических файлов по их заголовкам, например:  

var stream : TFileStream;
buff   : int64;
…
stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyRead);
  stream.Read(buff, sizeof(buff));
  stream.Free;
  case (buff and $FFFFFFFF) of
    $E0FFD8FF : result := 'JPEG IMAGE';
    $E2FFD8FF : result := 'JPEG CANNON EOS JPEG FILE';
…


Используя http://www.filesignatures.net/index.php?page=all&order=EXT&alpha=P.
Но когда я подставляю сигнатуру для «*.*png» - $0A1A0A0D474E5089 (в 8 байт) в case:

case buff of
    $0A1A0A0D474E5089 : result := 'PNG';
end


у меня ошибка:


  Constant expression violates subrange bounds


Как быть в этом случае?
    


Ответы

Ответ 1



Как сказано в документации, ограничение 32 бита: http://docwiki.embarcadero.com/RADStudio/XE3/en/Declarations_and_Statements#Case_Statements any expression of an ordinal type smaller than 32 bits (string types and ordinals larger than 32 bits are invalid) Выход - делать приведение к 32 битам или писать в блоке else case (buff and $FFFFFFFF) of $E0FFD8FF: Result := 'JPEG IMAGE'; $E2FFD8FF: Result := 'JPEG CANNON EOS JPEG FILE'; $474E5089: if buff shr 32 = $0A1A0A0D then Result := 'PNG'; // <-- вариант номер 1 else if buff = $0A1A0A0D474E5089 then // <-- вариант номер 2 Result := 'PNG'; end;

Комментариев нет:

Отправить комментарий