Страницы

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

пятница, 16 ноября 2018 г.

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

Я определяю типы графических файлов по их заголовкам, например:
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
Как быть в этом случае?


Ответ

Как сказано в документации, ограничение 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;

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

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