Entwickler-Ecke
Dateizugriff - bestimmten hex wert ändern
Schakal - So 02.11.03 23:23
Titel: bestimmten hex wert ändern
wie kann ich einen bestimmten hex-wert ändern.
also bei einem programm den hex in der position xxx ändern.
wie geht das?
Tino - Mo 03.11.03 10:10
Möchtest du in einer Datei ein bestimmtes Byte ändern?
Gruß
Tino
Schakal - Mo 03.11.03 10:46
ne also
folgendes soll es machen
nehmen wir an du hast einen hex-editor. damit öffnest du eine .exe datei.
dann siehste ja das komplette progrmam in hex-darsteellung.
bei der position 180 steht jetzt z.B. A6.
und ich will jetzt, das mein programm, diesen hexwert in der position 180 durch einen ändert den man in meinem programm eingeben kann.
Udontknow - Mi 05.11.03 12:26
Ja, wie jetzt? Also willst du doch Bytes in der Datei ändern. Jeweils zwei Hexwerte stellen doch ein Byte der Datei dar.
Cu,
Udontknow
Schakal - Mi 05.11.03 16:28
ja, nur will ich nicht nach dem byte suchen lassen, sondern nach der position in der das steht und das so ändern.
Udontknow - Mi 05.11.03 16:48
Wie wär´s mit der Verwendung von Streams?
Beispiel mit TMemoryStream:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var Stream:TMemoryStream; begin Stream:=TMemoryStream.Create; try Stream.LoadFromFile(FileName); Stream.Position:=PositionOfByte; Stream.Write(NewByte,SizeOf(NewByte)); Stream.SaveToFile(Filename); finally Stream.Free; end; end; |
Cu,
Udontknow
Schakal - Do 06.11.03 18:46
hmm...
funzt immer noch nicht ganz
hab folgenden code
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var Stream:TMemoryStream; begin Stream := TMemoryStream.Create; TempX := StrToInt(Edit1.Text); NeuX := IntToHex(TempX,2); Label1.Caption := Neux; try Stream.LoadFromFile(Projekt); Stream.Position := $8FC21; Stream.Write((NeuX), SizeOf(NeuX)); Stream.SaveToFile(Projekt); finally Stream.Free; end; end; |
wenn ich das mache, die umrechnung in hex funktioniert zwar und wird in er label korrekt angezeigt, aber er scheint es nicht richtig in die datei zu schreiben. ka wieso.
Udontknow - Do 06.11.03 18:54
Äh, was für ein Typ ist NeuX? Die Funktion InttoHex liefert einen String, also versuchst du da einen String in den Stream zu schreiben!
So wird vorgegangen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var NewByte:Byte; begin Stream := TMemoryStream.Create; NewByte := StrToInt(Edit1.Text); Label1.Caption := IntToStr(NewByte); try Stream.LoadFromFile(Projekt); Stream.Position := $8FC21; Stream.Write((NewByte), SizeOf(NewByte)); Stream.SaveToFile(Projekt); finally Stream.Free; end; end; |
Alternativ kannst du auch ein Array of Byte nehmen, wenn du mehr als ein Byte in der Datei ändern willst.
Cu,
Udontknow
GecKo - Do 06.11.03 22:21
Hallo.
Also ich habe ein ähnliches Problem. Ich habe diese prozedur jetzt mal ausprobiert mit einem Array of Byte
Hier ist die Prozedur:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Var NewByte : Array of Byte; ....
Stream := TMemoryStream.Create; NewByte := $654A046D; try Stream.LoadFromFile('test.bin'); Stream.Position := $0; Stream.Write((NewByte), SizeOf(NewByte)); Stream.SaveToFile('test.bin'); finally Stream.Free; end; |
Der Compiler meldet mir allerdings:
Incompatible types 'integer' and dynamic array.
Weiss da einer Rat ?!
danke für jegliche Hilfe
MfG Gecko
Udontknow - Fr 07.11.03 09:01
Hi!
Ein "Array-Of" ist ein sogenanntes dynamisches Array, bei dem die Anzahl der Elemente zur Entwurfszeit nicht feststeht. Daher kann SizeOf dir auch nicht die Grösse zurückgeben.
Lösung A:
Array[0..3] of Byte verwenden.
Lösung B:
Die Länge des dynamischen Bytes festlegen (SetLength), anschliessend nicht SizeOf, sondern Length(Array)*GrösseDesElements (bei Byte 1) an WriteBuffer übergeben.
PS:
Sehe gerade, daß das ja gar nicht dein Problem war... :wink:
Wenn du ab Position 0 die Werte $654A046D eintragen willst, musst du den Array dann entsprechend bestücken.
Delphi-Quelltext
1: 2: 3: 4:
| Neu[0]:=$65; Neu[1]:=$4A; Neu[2]:=$04; Neu[3]:=$6D; |
Cu,
Udontknow
GecKo - Fr 07.11.03 14:06
Dake für die schnelle antwort. super forum :)
Schakal - Sa 08.11.03 15:43
| Udontknow hat folgendes geschrieben: |
Äh, was für ein Typ ist NeuX? Die Funktion InttoHex liefert einen String, also versuchst du da einen String in den Stream zu schreiben!
So wird vorgegangen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var NewByte:Byte; begin Stream := TMemoryStream.Create; NewByte := StrToInt(Edit1.Text); Label1.Caption := IntToStr(NewByte); try Stream.LoadFromFile(Projekt); Stream.Position := $8FC21; Stream.Write((NewByte), SizeOf(NewByte)); Stream.SaveToFile(Projekt); finally Stream.Free; end; end; |
Alternativ kannst du auch ein Array of Byte nehmen, wenn du mehr als ein Byte in der Datei ändern willst.
Cu,
Udontknow |
neux ist vom typ string
und so wie du es oben beschrieben hast, klappt es leider nicht
Udontknow - So 09.11.03 17:00
Vielleicht sagst du einfach mal, was nicht klappt. Bekommst du eine Fehlermeldung beim Ausführen? Oder beim Kompilieren?
Cu,
Udontknow
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!