Einzelnen Beitrag anzeigen

fux75

Registriert seit: 31. Mär 2020
2 Beiträge
 
#2

AW: Encrypted ZipFile

  Alt 31. Mär 2020, 12:33
Hallo WiPhi,

Ich bin auf genau das selbe Problem gestoßen. Allerdings ging es bei mir um viele kleine Dateien.

Wie du auch, vermutete ich das Problem im
Code:
Seek
des
Code:
TDecryptStream
.

Ich habe die Implementierung folgendermaßen angepasst:

Code:
function TDecryptStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
var
  curPos: Int64;
  newPos: Int64;
begin
  curPos := FStream.Position;
  newPos := CurPos;
  case Origin of
    soBeginning: newPos := Offset;
    soCurrent: newPos := curPos + Offset;
    soEnd: newPos := FStreamSize + Offset;
  end;
  if newPos < curPos then begin
//    ResetStream;
//    result := Skip(newPos);
    FStream.Position := FStreamStartPos + newPos;
    result := FStream.Position;
  end
  else begin
    result := Skip(newPos - curPos);
  end;
end;
Der Originalcode in
Code:
newPos < curPos
ist auskommentiert und durch die beiden neuen Zeilen im Block ersetzt.

Ich habe es auch mit einigen großen ca. 10MB und einer 290MB großen Datei getestet. Bei mir funktioniert der Aufruf von
Code:
aZipFile.Read(aZipFileIndex, aBytes)
mit dem Index der Datei und einem Byte Array.
Nebeneffekt ist, dass die Dekomprimierung nicht merklich langsamer wird, je mehr aus dem Zip File gelesen wird. Zumindest in dem umgeschriebenen Abschnitt wird der von Uwe Raabe erwähnte Brute Force Ansatz vermieden.

Vielleicht hilft es dir auch.
Vielen Dank auch an Uwe Raabe für die Quellen.


Gruß fux!!!
  Mit Zitat antworten Zitat