如何读取无类型文件的字节标题,然后在Free Pascal和Lazarus中使用和显示那些文件流时的数据

时间:2011-04-11 21:59:06

标签: lazarus freepascal

我正在尝试使用Lazarus学习Free Pascal,我的一个宠物项目涉及读取一组特定无类型文件的64字节标题,这些文件无法使用文本或ASCII相关程序读取和显示(因此无法直接输出到备忘录等)。

到目前为止,我已经设计了以下代码,我认为这个代码在标题的64个字节中读取,我使用TStreams和“选择目录”对话框来执行此操作,基于通过Lazarus收到的建议IRC。我的问题是如何实际使用从头部读入缓冲区的数据?例如,在标题中,有8个字节的序列,然后是16个字节,然后是2个字节,依此类推,我想“继续”生成其他输出,最终将转换为字符串进入我的字符串网格。

到目前为止我的一些内容是基于我在这里找到的Mason Wheeler在最后写的内容(http://stackoverflow.com/questions/455790/fast-read-write-from-file-in-delphi )但它只显示如何阅读它,而不是如何使用它。我也读了这篇文章(http://stackoverflow.com/questions/4309739/best-way-to-read-parse-a-untyped-binary-file-in-delphi),但它又告诉你如何读取数据也是,但随后不使用数据。任何指导都被收到了!到目前为止,下面的代码只是将单值整数输出到编辑框,而不是例如8个十六进制值的范围。

PS - 我是编程的新手,所以请保持温和!没有什么太复杂的了。

procedure TForm1.ProbeFile(FileIterator: TFileIterator);

type
 TMyHeader = Array[1..64] of packed record
 First8Bytes,
 Next16Bytes,
 Next2Bytes: byte;
 end;

var

  FI : TFileIterator;                      //File Iterator class
  SG : TStringGrid;
  NumRead : SmallInt;
  FileToProbe: TStream;
  header: TMyHeader;

begin
  FI := TFileIterator.Create;
  SG := TStringGrid.Create(self);


  // Open the file and read the header
  FileToProbe := TFileStream.Create(FileIterator.FileName, fmOpenRead);
  try
    FileToProbe.seek(0, soFromBeginning);
    FileToProbe.ReadBuffer(header, SizeOf(header));
    edit1.text := IntToStr(header[0].First8Bytes);  // Just outputs '0' to the field?  If I try '10' it ooutputs '29' and so on
  finally
    FileToProbe.Free;
  end; 

1 个答案:

答案 0 :(得分:2)

如果我误解了你的问题,请原谅我。

据我所知,有一个64字节的标题。前8个字节属于一起,然后是接下来的16个字节,最后是另外2个字节。

对我来说,这个标题的声明似乎应该是:

   TMyHeader = packed record
     First8Bytes: array[0..7] of byte;  
     Next16Bytes: array [0..15] of byte;
     Next2Bytes: array [0..1] of byte;
     // add more if you like
   end;

此记录类型的大小为8 + 16 + 2 = 26个字节。

您读取标题的代码对我来说没问题,所以我不再重复了。

可以检索标题中的next16bytes,例如,如下所示:

edit1.text:= '';
// needs a declaration of a variable "i" as integer
for i:= 0 to 15 do
  edit1.text:= edit1.text + IntToStr(header.next16bytes[i]) + '-';

更改标题的next2bytes部分中第一个字节的值,如下所示(再次作为示例):

header.next2bytes[0]:= 123;

最后,您可以借助filetoprobe.writebuffer方法将更改写回文件的标题。