Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Stream - Negative Dateigrösse (>4GB) und dessen Behandlung (https://www.delphipraxis.net/171634-stream-negative-dateigroesse-4gb-und-dessen-behandlung.html)

jaikai 16. Nov 2012 10:09

Stream - Negative Dateigrösse (>4GB) und dessen Behandlung
 
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;

himitsu 16. Nov 2012 10:32

AW: Stream - Negative Dateigrösse (>4GB) und dessen Behandlung
 
Wieso global suchen und ersetzen?
Ein bissl hingucken mußt'e natürlich auch noch. :angle2:

z.B. i wird Int64, aber nicht read.

oder
Delphi-Quellcode:
function TDCP_cipher.EncryptStream(InStream, OutStream: TStream; MaxSize: Int64): Int64;
var
  Buffer: array[0..8191] of byte;
  Read: LongWord; // hier der Type, welcher auch als Param/Result bei InStream.Read genutzt wird (falls das LongWord ist, dann so lassen)
begin
  Result := 0;
  Read := SizeOf(Buffer);
  while (MaxSize > 0) and (Read = SizeOf(Buffer)) do
  begin
    Read := InStream.Read(Buffer, Min(SizeOf(Buffer), MaxSize));
    Encrypt(Buffer, Buffer, Read);
    OutStream.Write(Buffer, Read);
    Inc(Result, Read);
    Dec(MaxSize, Read);
  end;
end;

jaikai 16. Nov 2012 11:44

AW: Stream - Negative Dateigrösse (>4GB) und dessen Behandlung
 
Danke!

Deine zehn schlappen Zeilen Code sind das Aspirin für mein 6-tägiges Kopfzerbrechen!

Klappt wunderbar...hehe... ich glaubs nicht...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz