Обычно вы делаете
const
MAGIC_WORD = $535B;
type
TMyFileTypeHeader = packed record
MagicWord: word; // = MAGIC_WORD
Size: cardinal;
Version: cardinal;
Width: cardinal;
Height: cardinal;
ColorDepth: cardinal;
Title: array[0..31] of char;
end;
procedure ReadFile(const FileName: string);
var
f: file;
amt: integer;
FileHeader: TMyFileTypeHeader;
begin
FileMode := fmOpenRead;
AssignFile(f, FileName);
try
Reset(f, 1);
BlockRead(f, FileHeader, sizeof(TMyFileTypeHeader), amt);
if FileHeader.MagicWord <> MAGIC_WORD then
raise Exception.Create(Format('File "%s" is not a valid XXX file.', [FileName]));
// Read, parse, and do something
finally
CloseFile(f);
end;
end;
Например, файл растрового изображения начинается со структуры BITMAPFILEHEADER
, за которой (в версии 3) следует BITMAPINFOHEADER
.Далее следует необязательный массив элементов палитры, за которым следуют несжатые данные пикселей RGB (в простейшем случае, здесь, в 24-битном формате): BBGGRRBBGGRRBBGGRR ...
С другой стороны, чтение JPG - это очень сложно, потому что данные JPG сжимаются таким образом, что для их понимания требуется много математики (я думаю - я действительно никогда не копался в спецификациях JPG).По крайней мере, это верно для многих современных форматов графических файлов.BMP, с другой стороны, тривиален - «худшее», что может произойти, это сжатие изображения RLE.
«Детали» синтаксического анализа файла полностью зависят от формата файла.Формат файла спецификация сообщает разработчику, как данные хранятся в двоичной форме (выше, две структуры растрового изображения являются частью спецификации растрового изображения Windows).Это как контракт, подписанный (не буквально) всеми кодировщиками / декодерами таких файлов.В случае EBML, спецификация, кажется, доступна здесь .