Thema: Delphi Schnellere XOR Operation

Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Schnellere XOR Operation

  Alt 3. Jan 2009, 11:05
Basierend auf Deinem ersten Beitrag würde ich die Prozedure wie folgend anpassen:
Delphi-Quellcode:
procedure Crypt(const NameOfFileToEncode, KeyFilename: String);
type
  TKeyArray = array[0..524287] of Byte;
  PKeyArray = ^TKeyArray;
var
  FS: TFilestream;
  // Arbeiten mit Pointern, da sonst der Stack-Speicher knapp wird ;-)
  Keys, Buffer: PKeyArray;
  BytesRead, KeyArraySize, LastPositionRead, I: Cardinal;
begin
  // Speicher für Keys und Buffer reservieren
  KeyArraySize := SizeOf(TKeyArray);
  Keys := GetMemory(KeyArraySize);
  Buffer := GetMemory(KeyArraySize);

  try
    // falls die Keys-Datei mal kleiner ist, dann sollte wenigstens der Buffer eindeutig sein
    FillChar(Keys^, KeyArraySize, #0);
    FS := TFileStream.Create(KeyFilename, fmOpenRead);
    try
      FS.Read(Keys^, 524288);
    finally
      FS.Free;
    end;

    FS := TFileStream.Create(NameOfFileToEncode, fmOpenReadWrite);
    try
      repeat
        // Nächsten Block einlesen und zurück gehen in der Datei
        LastPositionRead := FS.Position;
        BytesRead := FS.Read(Buffer^, KeyArraySize);
        FS.Position := LastPositionRead;

        // Block "verschlüsseln"
        for I := 0 to BytesRead - 1 do
          Buffer^[I]:= Buffer^[I] xor Keys^[I];

        // Block zurückschreiben
        FS.Write(Buffer^, BytesRead);

        // abbrechen, wenn das Ende der Datei erreicht wurde
        if BytesRead < KeyArraySize then
          Break;
      until True;
    finally
      FS.Free;
    end;
  finally
    // Speicher wieder frei geben
    FreeMem(Keys);
    FreeMem(Buffer);
  end;
end;
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat