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

标签 delphi binaryfiles

我想知道解析非类型二进制文件的最佳方法是什么。例如,EBML 文件。 (http://ebml.sourceforge.net/)。 EBML 基本上是一个二进制 xml 文件。它基本上可以存储任何内容,但目前它的主要用途是 MKV 视频文件 (matroska)。

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

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

最佳答案

基本上,你会的

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 位图规范的一部分)。它就像一份契约(Contract),由此类文件的所有编码器/解码器签署(不是字面上的)。对于 EBML,规范似乎可用 here .

关于delphi - 在 Delphi 中读取/解析非类型二进制文件的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4309739/

相关文章:

java - 使用缓冲区读取二进制文件

javascript - 如何将响应中的二进制图像解析为base64字符串?

multithreading - 暂停线程的执行而不休眠?

delphi - Indy 10 + XE8 长文件名分段上传

delphi - 当 ping.exe 成功时,什么会导致 ICMPsendEcho 失败

java - ObjectInputStream.readobject() 在异常中抛出对象

c - 将数字数据存储在二进制文件和数据结构中

json - 在 Datasnap (Delphi 10) 中旋转数据集 JSON 结果

delphi - 如何检查某项是否支持通用接口(interface)?

python - 如何使用 Python 打开 Unix 可执行文件?