我正在尝试使用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;
答案 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方法将更改写回文件的标题。