Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Offset Block aus Datei extrahieren (https://www.delphipraxis.net/195394-offset-block-aus-datei-extrahieren.html)

fringer 25. Feb 2018 13:28

Offset Block aus Datei extrahieren
 
Hallo Community,

ich habe seit mehr als 10 Jahren nicht mehr programmiert, würde aber gern
wieder damit anfangen. Gelernt habe ich damals in meiner Lehre mit Delphi 5.
Die Version die ich jetzt gerade installiert habe ist Delphi 7.

Ich würde gern ein kleines Programm schreiben das aus einer
Datei einen bestimmten Teil extrahiert und dann wieder exakt an
dieser Stelle einsetzt.

Klingt erstmal einfach, stellt sich aber doch recht kompliziert
für mich heraus ;) Daher suche ich etwas Hilfe:

Folgende Problematik:
Datei XYZ.DAT ist ca. 4MB, in dieser Datei sitzt ein Byte-Block
vom Offset 0x003E1000 bis 0x003E37FF (das sind 10.240 Bytes).
Diesen Block möchte ich in eine neue extra Datei 1:1 extrahieren.

Versucht habe ich das mit TMemoryStream. Sehr weit bin ich noch
nicht gekommen (siehe Code).

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ms : TMemorystream;
  MyOffSet : Integer;

begin
  if Opendialog1.Execute then
  begin
    ms := TMemoryStream.Create;
    MyOffSet := $003E1000;

    try
      ms.LoadFromFile(opendialog1.FileName); // Lade Datei in Stream
      ms.Position := MyOffSet;              // gehe zu Offset-Adresse

........

    finally
      ms.Free;

    end;
        end;
            end;

end.
Ich habe die Datei geöffnet und in einen Stream geladen und bin
auch zu besagter Adresse gesprungen. Aber jetzt weiß ich nicht
so richtig weiter.

Wie kann ich definieren wie groß/wie lang dieser Stream
ist (soll wie oben schon geschrieben immer 10.240 Bytes lang sein)
bzw. das er nur das ab der bestimmten Offset Adresse bis zu der
End-Offset Adresse kopiert.

Könntet ihr mir da etwas Hilfestellung geben?
Vielen herzlichen Dank schon mal.

fringer

himitsu 25. Feb 2018 13:52

AW: Offset Block aus Datei extrahieren
 
Mit Delphi-Referenz durchsuchenTStream.CopyFrom non aktueller Position x Bytes in anderen Stream kopieren
oder mit Delphi-Referenz durchsuchenTStream.Read bzw. besser Delphi-Referenz durchsuchenTStream.ReadBuffer x Bytes z.B. in ein Array kopieren

am Ende dann die Position nochmal an den Teil-Anfang setzen und die Daten wieder zurückschreiben. (CopyFrom, Write, WriteBuffer)
[edit] Wenn man diesen Datenblock in der Datei wieder überschreiben will.


Tipp der nichts mit dem Problem zu tun hat: https://www.embarcadero.com/de/products/delphi/starter

Redeemer 25. Feb 2018 17:32

AW: Offset Block aus Datei extrahieren
 
Arrays sind eher kompliziert hier. Wenn er das nur speichern und nichts damit machen will, ist er mit TMemoryStream oder TFileStream schon gut beraten.

fringer 26. Feb 2018 10:18

AW: Offset Block aus Datei extrahieren
 
Vielen Dank erst mal für eure Antworten und Tipps. Für mich ist das Thema „Streams“ Neuland und ich versuche es so gut es geht zu verstehen aber es gelingt mir noch nicht sonderlich gut.

Ich habe das ganze gestern noch einmal mit TFileStream probiert und komme auch wieder nur bis zu dem selben Punkt wie mit TMemoryStream. Ich kann eine Datei in einen Stream öffnen, dann die Position festlegen wo er beginnen soll und dann komme ich leider wieder nicht weiter.
Ich verstehe die Theorie von himitsu kann sie aber nicht anwenden. Wie schreibe ich denn die Syntax wenn ich von dieser Startposition (Hex Offset $0x003E1000) in einen neuen String bis zur Endposition (Hex Offset $0x003E37FF) kopiere. Oder ist mein Denkfehler das ich immer diese Hexwerte verwenden möchte?

Ich möchte natürlich nicht das ihr mir mein Programm schreibt, wäre es aber möglich einen etwas detaillierteren psyeudocode für mich zu formulieren, ich möchte das wirklich gern verstehen. Das wäre klasse.

Vielen Dank im Voraus schon mal.

freimatz 26. Feb 2018 10:34

AW: Offset Block aus Datei extrahieren
 
kurzen pseudocode einfach so ins Blaue:

statt Deinem "........"

dest := TMemoryStream.Create;
try
dest.CopyFrom(ms, count)
dest.SaveToFile(...)
finally
dest.Free();
end;

fringer 1. Mär 2018 11:26

AW: Offset Block aus Datei extrahieren
 
Hallo,
ich wollte mich noch mal bedanken! Mein Vorhaben konnte ich nun realisieren und so langsam werde ich mit dem Thema "Streams" warm.
Danke für die vielen kleinen Tipps. Ich habe jetzt wieder eine kleine Sache: und zwar möchte ich eine bestimmte Byte-Sequenz im Stream suchen lassen
und mir dann die Anfangsposition wiedergeben lassen.

Ich denke ich bekomme das hin, habe hier mal ein Beispiel gefunden -> http://www.delphipages.com/forum/showthread.php?t=20735
Wäre das der richtige Lösungsansatz?

Viele Grüße,
fringer

Luckie 1. Mär 2018 14:24

AW: Offset Block aus Datei extrahieren
 
Für eine neuen Problemstellung/Frage mach bitte einen neuen Thread auf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz