Einzelnen Beitrag anzeigen

endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#1

Strings in Datein jeder Größen und Typs

  Alt 17. Aug 2005, 19:27
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;
  Mit Zitat antworten Zitat