1

我正在尝试使用 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; 
4

1 回答 1

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 方法将您的更改写回文件的头部。

于 2011-04-11T23:35:35.887 回答