Autor Beitrag
Schakal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 03.11.03 10:10 
Möchtest du in einer Datei ein bestimmtes Byte ändern?

Gruß
Tino
Schakal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 05.11.03 16:48 
Wie wär´s mit der Verwendung von Streams?

Beispiel mit TMemoryStream:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Do 06.11.03 18:46 
hmm...
funzt immer noch nicht ganz
hab folgenden code

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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:

ausblenden 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



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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.

ausblenden 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



BeitragVerfasst: Fr 07.11.03 14:06 
Dake für die schnelle antwort. super forum :)
Schakal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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