Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
Delphi 12 Athens
|
Re: Schnellere XOR Operation
3. Jan 2009, 12: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 Lizbeth Ich bin nicht zurück, ich tue nur so
|
|
Zitat
|