Я пытаюсь изучить Free Pascal с помощью Lazarus, и один из моих любимых проектов включает чтение 64-байтовых заголовков определенного набора нетипизированных файлов, которые не могут быть прочитаны и отображены с использованием текстовых или связанных с ASCII процедур (поэтому не могут быть выведены непосредственно в блоки Memo и т. Д. ).
До сих пор я разработал следующий код, который, как мне кажется, считывает 64 байта заголовка, и я использую TStreams и диалоговое окно «Выбрать каталог» для этого на основе рекомендаций, полученных через Lazarus IRC. Мой вопрос, однако, заключается в том, как на самом деле ИСПОЛЬЗОВАТЬ данные, которые считываются в буфер из заголовка? Например, в заголовках есть последовательности из 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 шестнадцатеричных значений.
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;