Лучший способ прочитать / проанализировать нетипизированный двоичный файл в Delphi - PullRequest
2 голосов
/ 30 ноября 2010

Я хотел бы знать, как лучше всего анализировать нетипизированный двоичный файл. Например, файл EBML. (http://ebml.sourceforge.net/). EBML - это, по сути, двоичный XML-файл. Он может хранить в основном все, что угодно, но его преимущественным использованием сейчас являются видеофайлы MKV (matroska).

Чтобы прочитать файл EBML на уровне байтов, прочитайте заголовок, убедитесь, что это файл EBML, и получите информацию о файле. Файлы MKV могут быть огромными, размером 1-30 ГБ.

Бинарный файл может быть любым, JPEG, BMP, AVI и т. Д. Я просто хочу научиться их читать.

Ответы [ 3 ]

3 голосов
/ 30 ноября 2010

Просто используйте TFileStream, вот так ...

var MyFile: TStream;
begin
MyFile := TFileStream.Create( fmOpenRead, FileName);
try
  // Read stuff
  MyFile.ReadBuffer( MyVariable, SizeOf( MyVariable));
  // etc.
finally
  MyFile.Free
  end;
3 голосов
/ 30 ноября 2010

Обычно вы делаете

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, спецификация, кажется, доступна здесь .

0 голосов
/ 30 ноября 2010

Вы можете отобразить файл в памяти.Тогда вы можете получить к нему доступ, как если бы вы обращались к памяти.Смотри http://msdn.microsoft.com/en-us/library/aa366556(VS.85).aspx

...