Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi HEX Position umschreiben (https://www.delphipraxis.net/153286-hex-position-umschreiben.html)

F.Art 28. Jul 2010 01:35

HEX Position umschreiben
 
Derzeit benutze ich einen HEX Editor um eine bestimmte Possition in einer Datei (Spielstand) um zu schreiben. Nur möchte ich dies nicht immer von Hand erledigen. Daher würde ich gerne ein Delphi Projekt machen, was diese Possition ermittelt und um schreibt.

Wie stelle ich das nun an?

XHelp 28. Jul 2010 03:01

AW: HEX Position umschreiben
 
Wenn du nach "HEX" hier im Forum suchst, findest du jede Menge Themen darüber.
http://www.delphipraxis.net/123574-i...speichern.html
http://www.delphipraxis.net/55161-he...schreiben.html
http://www.delphipraxis.net/108318-d...-ausgeben.html
usw.

F.Art 28. Jul 2010 11:44

AW: HEX Position umschreiben
 
Der dritte Link "Datei inhalt als HEX-String ausgeben..."
Interessiert mich, nur wenn ich das beispiel benutze bekomme ich eine Fehlermeldung.

procedure TForm1.Display(const S: string);
Undefinierter Bezeichner: ‚Display‘

--------------------------

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  datei: TMemoryStream;
begin
if FileExists('at') then begin
   datei := TMemoryStream.Create;
   try datei.LoadFromfile('at');
       finally datei.SaveToFile('at2') end;
   datei.Free
   end;
end;
mich würde noch interessieren wie groß eine datei sein darf um sie so einladen zu können in den speicher? und ich dachte mir das ich in dem memorystream nun die possition abändere und wieder speicher. nur habe ich noch keine idee wie ich die possition ansteuern lasse und ändere.

Klaus01 28. Jul 2010 14:43

AW: HEX Position umschreiben
 
Zitat:

Zitat von F.Art (Beitrag 1038092)
Der dritte Link "Datei inhalt als HEX-String ausgeben..."
Interessiert mich, nur wenn ich das beispiel benutze bekomme ich eine Fehlermeldung.

procedure TForm1.Display(const S: string);
Undefinierter Bezeichner: ‚Display‘

Hallo,

du kannst Dir ein TMemo auf das Formular legen
und es Display nennen.
Dann dürfte der Fehler verschwinden.

Grüße
Klaus

rollstuhlfahrer 28. Jul 2010 14:49

AW: HEX Position umschreiben
 
Zitat:

Zitat von F.Art (Beitrag 1038092)
mich würde noch interessieren wie groß eine datei sein darf um sie so einladen zu können in den speicher? und ich dachte mir das ich in dem memorystream nun die possition abändere und wieder speicher.

Wenn du einen TFileStream nimmst, dann dürfen die Dateien SEHR groß werden (> 3 GB). Bei der Verwendung eines TMemoryStreams bist du an die 2GB-Marke gebunden.

Bernhard

PS: Positionen steuert man sinnvollerweise mit .Position an.

F.Art 28. Jul 2010 21:42

AW: HEX Position umschreiben
 
[QUOTE=Klaus01;1038129
Hallo,

du kannst Dir ein TMemo auf das Formular legen
und es Display nennen.
Dann dürfte der Fehler verschwinden.

Grüße
Klaus[/QUOTE]

das funktionierte nicht, habe es aber ans laufen bekommen.
procedure Display(const S: string); einfach bey types reingeschmissen.


Zitat:

Zitat von rollstuhlfahrer (Beitrag 1038135)
Wenn du einen TFileStream nimmst, dann dürfen die Dateien SEHR groß werden (> 3 GB). Bei der Verwendung eines TMemoryStreams bist du an die 2GB-Marke gebunden.

Bernhard

PS: Positionen steuert man sinnvollerweise mit .Position an.

also 2gb reicht mir voll und ganz.

also mit
Delphi-Quellcode:
datei.Position:=$AED3;
kann ich anscheind auf die possition springen, nun möchte ich genau diesen wert durch 3F zb ersetzen, wie mache ich das?

rollstuhlfahrer 29. Jul 2010 07:02

AW: HEX Position umschreiben
 
Zitat:

Zitat von F.Art (Beitrag 1038241)
das funktionierte nicht, habe es aber ans laufen bekommen.
procedure Display(const S: string); einfach bey types reingeschmissen.

Es liegt einfach daran, dass du es hier mit OOP zu tun hast. Heißt: Alles was du unterhalb von implementation an dein Objekt gebunden hast, muss auch oberhalb so sein und anders herum. Du musst also diese eine rot markierte Zeile in die Deklaration deines Objektes kopieren und den Objektnamen samt Punkt wieder aus der kopierten Zeile rausschmeißen.

Zitat:

Zitat von F.Art (Beitrag 1038241)
nun möchte ich genau diesen wert durch 3F zb ersetzen, wie mache ich das?

Jetzt kommt es darauf an, wie viele Bytes du ersetzen willst. Für 1 Byte kannst du Byte als Datentyp verwenden, 2 Bytes -> Word, 4 Bytes: Integer/Cardinal. Dann musst du in deine Variable (Zahl) deine Zahl reinschreiben. Mit Hilfe von .Write kannst du dann schreiben. .Read ist das äquivalent fürs lesen.

Bernhard

F.Art 29. Jul 2010 11:47

AW: HEX Position umschreiben
 
Delphi-Quellcode:
procedure WriteHEX(fs: TMemoryStream; hexpos: string; hex: string);
var
  buf: array of byte;
  i: integer;
begin
fs.Position:=StrToInt('$'+hexpos);
SetLength(buf, Length(hex) shr 1);
for i := Low(buf) to high(buf) do
    buf[i] := StrToInt('$' + Copy(hex, Succ(i shl 1), 2));
fs.Write(buf[0], Length(buf));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if FileExists('at') then begin
   datei := TMemoryStream.Create;
   try datei.LoadFromfile('at');
       finally
         WriteHex(Datei, 'AED6', 'FF');
         datei.SaveToFile('at2');
         end;
   datei.Free
   end;
end;
dies wäre nun meine lösung.
würde mir jemand dies nun noch optimieren und vereinfachen soweit es möglich ist?

rollstuhlfahrer 29. Jul 2010 14:38

AW: HEX Position umschreiben
 
Da alle Streams in Delphi auf TStream aufbauen, würde ich die Prozedur nicht auf TMemoryStream beschränken, sondern es offen lassen, welche Art von Stream verwendet werden darf. Heißt:
Delphi-Quellcode:
procedure WriteHEX(fs: TStream; ...
. Außerdem würde ich die Prozedur nicht mit Stringwerten befüllen, sondern dafür echte Zahlen nehmen. HEX-Konstanten werden ja auch als Zahl übergeben.

Bernhard

Blup 29. Jul 2010 15:13

AW: HEX Position umschreiben
 
Wird der Rückgabewert von Write nicht auswertet, statt dessen WriteBuffer verwenden.
Dann wird im Fehlerfall zumindest eine Exception ausgelöst.

Bitte rück mal den Code auch ordentlich ein, erstens ist es verständlicher und man findet eventuelle Fehler auch einfacher...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 Uhr.
Seite 1 von 2  1 2      

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