| Autor |
Beitrag |
Schakal
      
Beiträge: 50
|
Verfasst: So 02.11.03 23:23
wie kann ich einen bestimmten hex-wert ändern.
also bei einem programm den hex in der position xxx ändern.
wie geht das?
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mo 03.11.03 10:10
Möchtest du in einer Datei ein bestimmtes Byte ändern?
Gruß
Tino
|
|
Schakal 
      
Beiträge: 50
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 50
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 50
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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...
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
Hält's aus hier
Beiträge: 5
|
Verfasst: Fr 07.11.03 14:06
Dake für die schnelle antwort. super forum 
|
|
Schakal 
      
Beiträge: 50
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
|
|