Einzelnen Beitrag anzeigen

jaikai

Registriert seit: 1. Jun 2005
70 Beiträge
 
#1

Stream - Negative Dateigrösse (>4GB) und dessen Behandlung

  Alt 16. Nov 2012, 10:09
Moin,

das Problem stellt sich mir unter Win32/XP (D5 und D2007), vermutlich würde sich unter Win7 etc. auch nichts ändern.

Unter D5 ist die Stream.Size als LongInt definiert, unter D2007 als int64.
Gegeben ist eine Datenmenge, die (ob zip-komprimiert oder nicht) größer als 4 GB ist.
Die Zipper (zB Abbrevia) schaffen 4GB+ mühelos...

Dateigröße (Beispiel): 4.463.464.945 Bytes (4.15 GB)
Wenn ich große Dateien nun verschlüsseln will (mit DCPCrypt/David Barton) werden nur 4GB geschrieben (4294967295 - longword). Ganze 160 MB werde ignoriert...

Dass ich irgendwas mit dem Longint/Longword machen muss ist mir völlig klar, aber ich finde den richtigen Ansatzpunkt nicht. Ein globales Suchen/ersetzen in int64 funktioniert nicht. Den ganzen (für mich halbherzig umgesetzten) int64 raff ich nicht wirklich...


Zitat:
Zitat (anderer Beitrag):
Size nach LongWord zu casten, damit können Werte bis 2^32-1 dargestellt werden (entspricht 4GB). Ansonsten sollte man Int64 verwenden (falls die Datei noch größer ist).
Hier mal eine Funktion, die den negativen Wert in die richtige Entsprechung umrechnet:

function RealeGroesse(aSize: LongInt): Longword;
begin
if aSize>=0 then Result:= aSize
else Result:= 2147483647 + (aSize+2147483648);
end;
Ich müsste etwas wie in dieser Art in int64 umsetzen.

Kann mir mal jemand auf die Sprünge helfen, wo ich ansetzen muss um das Ding so zu verbiegen, dass die große Datenmenge geschluckt und verarbeitet wird?





Delphi-Quellcode:
// aus DCPCrypt/David Barton
function TDCP_cipher.EncryptStream(InStream, OutStream: TStream; Size: longword): longword;
var
  Buffer: array[0..8191] of byte;
  i, Read: longword;
begin
  FillChar(Buffer, SizeOf(Buffer), 0);
  Result:= 0;
  for i:= 1 to (Size div Sizeof(Buffer)) do
  begin
    Read:= InStream.Read(Buffer,Sizeof(Buffer));
    Inc(Result,Read);
    Encrypt(Buffer,Buffer,Read);
    OutStream.Write(Buffer,Read);
  end;
  if (Size mod Sizeof(Buffer))<> 0 then
  begin
    Read:= InStream.Read(Buffer,Size mod Sizeof(Buffer));
    Inc(Result,Read);
    Encrypt(Buffer,Buffer,Read);
    OutStream.Write(Buffer,Read);
  end;
end;
Wenn die Programme das machen, wie's wir machen, wären sie unbrauchbar...
  Mit Zitat antworten Zitat