在Delphi中读取/解析无类型二进制文件的最佳方法

时间:2010-11-30 01:22:55

标签: delphi binaryfiles

我想知道解析无类型二进制文件的最佳方法是什么。例如,EBML文件。 (http://ebml.sourceforge.net/)。 EBML基本上是一个二进制xml文件。它基本上可以存储任何东西,但它现在占主导地位的是MKV视频文件(matroska)。

要在字节级别读取EBML文件,请读取标头以确保它是EBML文件并检索有关该文件的信息。 MKV文件可能很大,大小为1-30GB。

二进制文件可以是任何东西,jpeg,bmp,avi等...... 我只是想学习如何阅读它们。

3 个答案:

答案 0 :(得分:3)

基本上,你做

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,规范似乎可用here

答案 1 :(得分:3)

只需使用TFileStream,就像这样......

var MyFile: TStream;
begin
MyFile := TFileStream.Create( fmOpenRead, FileName);
try
  // Read stuff
  MyFile.ReadBuffer( MyVariable, SizeOf( MyVariable));
  // etc.
finally
  MyFile.Free
  end;

答案 2 :(得分:0)

你可以记忆地映射文件。然后,您可以像访问内存一样访问它。见http://msdn.microsoft.com/en-us/library/aa366556(VS.85).aspx