我想知道解析无类型二进制文件的最佳方法是什么。例如,EBML文件。 (http://ebml.sourceforge.net/)。 EBML基本上是一个二进制xml文件。它基本上可以存储任何东西,但它现在占主导地位的是MKV视频文件(matroska)。
要在字节级别读取EBML文件,请读取标头以确保它是EBML文件并检索有关该文件的信息。 MKV文件可能很大,大小为1-30GB。
二进制文件可以是任何东西,jpeg,bmp,avi等...... 我只是想学习如何阅读它们。
答案 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 ......
解析文件的“细节”完全取决于文件格式。文件格式规范告诉开发人员如何以二进制形式存储数据(上面,两个位图结构是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