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