![]() |
Strings in Datein jeder Größen und Typs
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: ![]() 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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz