1

私はLazarusを使用してFreePascalを学習しようとしていますが、私のペットプロジェクトの1つは、テキストまたはASCII関連の手順を使用して読み取ったり表示したりできない(メモボックスなどに直接出力できない)タイプされていないファイルの特定のセットの64バイトヘッダーを読み取ることです。 )。

これまでのところ、ヘッダーの64バイトを読み取る次のコードを考案しました。これを行うには、Lazarus IRCを介して受け取ったアドバイスに基づいて、TStreamsと[ディレクトリの選択]ダイアログボックスを使用しています。私の質問は、ヘッダーからバッファーに読み込まれたデータを実際にどのように使用するかです。たとえば、ヘッダーには、8バイト、16バイト、2バイトなどのシーケンスがあり、「作業」して他の出力を生成し、最終的に文字列に変換して文字列グリッドに入れます。 。

私がこれまでに持っているもののいくつかは、終わり近くにメイソンウィーラーによって書かれたここで見つけたものに基づいています(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つの16進値の範囲とは対照的に、単一値の整数を編集ボックスに出力するだけです。

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 に答える