Record mit Binärdaten füllen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
HobbyProgrammer
Beiträge: 166
Registriert: Di 29. Okt 2019, 12:51
Wohnort: Deutschland , Baden-Württemberg

Record mit Binärdaten füllen

Beitrag von HobbyProgrammer »

Hallo zusammen,

ich bin gerade dabei ein C/C++ Quelltext nach Pascal zu konvertieren. Nun bin ich da an einer Stelle von ein Struct Array mit Binärdaten aus einem Image gefüllt werden soll.
In C passiert das einfach mit einem Pointer auf das Struct Array und einem BlockRead.

In Pascal schaut das ganze so aus:

Code: Alles auswählen

type
    TPhysDirectoryEntry = record
        Status: byte;
        Name: array[0..7] of char;
        Ext: array[0..2] of char;
        Extnol: byte;
        Lrc: byte;
        Extnoh: byte;
        Blkcnt: byte;
        Pointers: array[0..15] of byte;
    end;
daraus wird dann ein Array:

Code: Alles auswählen

Dir: array of TPhysDirectoryEntry;
Das Array wird dann auf die nötige Größe gebracht:

Code: Alles auswählen

SetLength(Dir, ((((m_Drive.MaxDir) + m_Drive.BlkSiz - 1) div m_Drive.BlkSiz) * m_Drive.BlkSiz) div 16);
Dieses Record Array soll nun mit Binärdaten aus einem Image gefüllt werden. Die Daten liegen immer als 32byte Datensätze hintereinander in dem Image. Meine Frage ist nun,
kann ich auf das Array auch in Pascal einen Pointer setzen und die Daten dann per BlockRead aus dem Image in das Array schreiben, oder lieber ein Array of byte als Puffer erstellen und die Daten dann 'zu Fuß' in die Record Elemente schreiben?

Dieses Array muß auch irgendwann wieder in das Image geschoben werden, dann ist der ganze Vorgang dann in die andere Richtung zu machen.

Grüße
HobbyProgrammer
Host: Core i7-12700H, NVIDIA RTX3050 6GB, 32GB Ram, 1TB NVME SSD mit KUbuntu 22.04LTS 64bit , VM KUbuntu 22.04 LTS 64bit mit Lazarus 2.2.6 und Cross-Platform Compiler für Linux 32/64bit und Windows 32/64bit. Wine für erste Tests der Windows Binarys.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Record mit Binärdaten füllen

Beitrag von Socke »

HobbyProgrammer hat geschrieben:
Di 28. Mär 2023, 17:14
Meine Frage ist nun,
kann ich auf das Array auch in Pascal einen Pointer setzen und die Daten dann per BlockRead aus dem Image in das Array schreiben, oder lieber ein Array of byte als Puffer erstellen und die Daten dann 'zu Fuß' in die Record Elemente schreiben?
BlockRead nimmt keinen Pointer sondern direkte die Datenstruktur entgegen. Aber auch dann geht das:

Code: Alles auswählen

var
  f: File;
  Dir: array of TPhysDirectoryEntry;
begin
  AssignFile(f, 'myimage');
  reset(f, sizeof(TPhysDirectoryEntry));
  blockRead(f, Dir[0], length(Dir));
  CloseFile(f);
end.
Wenn du nicht nur TPhysDirectoryEntry in deinem Image hast, musst du immer wieder zwischen den Record-Größen wechseln. Oder du arbeitest Byte-weise, hast dann aber keine Hilfe durch den Compiler.

Code: Alles auswählen

var
  f: File;
  Dir: array of TPhysDirectoryEntry;
begin
  AssignFile(f, 'myimage');
  reset(f);
  BlockRead(f, m_Drive, sizeof(m_Drive)); // m_Drive oder andere Daten lesen
  BlockRead(f, Dir[0], length(Dir)*sizeof(Dir[0])); // beim Lesen von TPhysDirectoryEntry musst du die Anzahl Bytes selbst ausrechnen.
  CloseFile(f);
end.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

HobbyProgrammer
Beiträge: 166
Registriert: Di 29. Okt 2019, 12:51
Wohnort: Deutschland , Baden-Württemberg

Re: Record mit Binärdaten füllen

Beitrag von HobbyProgrammer »

Ok, das Lesen bzw. Schreiben geschieht über eine Lese/Schreibmethode in einer anderen Unit. Denke dann kommt auf die Schnelle nur die Byte-weise Methode in betracht.
Das ganze wird eine Übertragung der CP/M Tools welche in C geschrieben sind nach Free Pascal.
Diese Tools sind reine Consolen Anwendungen und laufen nur unter Linux richtig. Ich habe dafür schon in C/C++ eine GUI dafür geschrieben, aber je weiter das ganze forgeschritten ist, habe ich gemerkt das C/C++ nicht wirklich meine Welt ist. Und so soll das ganze nun in Lazarus/Free Pascal seine Fortsetzung finden.
Die GUI ist schon nahezu fertig, nur eben der funktionale Kern (CP/M Filesystem und CP/M Tools) muß nun eben nach Pascal konvertiert werden.

Wens interessiert: https://github.com/ProgrammingHobby/CPM ... e_Explorer (ist das C/C++ Projekt).

Die Lazarus/Free Pascal Version habe ich noch nicht auf Github hochgeladen. :)
Host: Core i7-12700H, NVIDIA RTX3050 6GB, 32GB Ram, 1TB NVME SSD mit KUbuntu 22.04LTS 64bit , VM KUbuntu 22.04 LTS 64bit mit Lazarus 2.2.6 und Cross-Platform Compiler für Linux 32/64bit und Windows 32/64bit. Wine für erste Tests der Windows Binarys.

Antworten