#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;
Комментариев нет:
Отправить комментарий