Hallo,
hier ein kleiner Code Schnippsel um Strings in Dateien
jeden Typs und jeder Größe zu bearbeiten. Benötigt wird hierzu
allerdings die FastStrings
Unit die man unter folgender
Adresse kostenlos runterladen kann:
http://www.droopyeyes.com/default.as...owProduct&ID=4
Diese
Unit basiert auf unterschiedlichen
ASM Algorythmen
und ermöglicht damit extrem schnelle String Operationen.
Alternativ kann man natürlich auch die hauseigenen Methoden
pos(), replace() usw. verwenden.
Im folgenden SourceCode wird eine Binärdatei (input.exe)
in einem String Blockweise eingelesen. Grundsätzlich
spielt die Größer der Datei dabei keine Rolle. Allerdings sollte
man bei größeren Dateien die Blöcke (Buffer: String) jeweils
einzelnd bearbeiten.
Da es sich hier im Beispiel bei der BinärDatei lediglich
um eine kleinere "Hello World" Applikation mit einem
entsprechendem Lable handelt, wird die gesamte Datei
in den String 'SourceFile' geladen;
Die Variable 'AppString' bezeichnet in diesem Fall
den String den wir in der BinärDatei ändern möchten
und der anschließend durch 'ReplaceString' ersetzt wird.
FastReplace ist eine Methode aus der empfohlenen FastStrings
Unit.
Damit nun die 'Hello World' Anwendung nach dem Bearbeiten
auch läuffähig bleibt muss geprüft werden ob der String
den wir ersetzen wollen die gleiche Größe hat.
Sofern der neue String zu groß ist ist ein Ersetzen ohne
weiteres nicht möglich. Dieser Fall wird in diesem
Beispiel momentan nicht behandelt. Um zu verhindern
das der gegensätzliche Fall eintritt wird der
neue String mit dem nachfolgendem Code mit Leerzeichen
auf die Orginalgröße aufgefüllt.
Format('%-'+IntToStr(length(AppString))+'s', [ReplaceString]);
Und das war es auch eigentlich schon.
Delphi-Quellcode:
uses FastStrings
...
var SrcStream: TFileStream; OutputFile: TextFile;
SourceFile, Buffer, Srcstring, AppString, ReplaceString: String;
Blocksize, ChunkLen: Integer;
N: Int64;
begin
Blocksize:= 1024;
SourceFile:= ExtractFilePath(Application.ExeName)+'input.exe';
try
SrcStream:=TFileStream.Create(SourceFile, fmOpenread or fmShareDenyNone);
Srcstring:='';
N:=SrcStream.Size;
while N>0 do
begin
if N>BlockSize
then ChunkLen:=BlockSize
else
ChunkLen:=N;
SetLength(Buffer,ChunkLen);
SrcStream.Read(Buffer[1],ChunkLen);
Srcstring:= Srcstring+copy(Buffer, 1, MaxInt);
N:=N-ChunkLen;
Buffer:= '';
end;
finally
SrcStream.Free;
end;
AppString:= 'Hello World';
ReplaceString:= 'dlroW olleH';
if length(ReplaceString) <= length(AppString) then
SrcString:= FastReplace(SrcString, AppString, Format('%-'+IntToStr(length(AppString))+'s', [ReplaceString]), True);
try
AssignFile(OutputFile, ExtractFilePath(Application.ExeName)+'output.exe');
ReWrite(OutputFile);
Write(OutputFile, SrcString);
finally
CloseFile(OutputFile);
end;