![]() |
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:
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; |
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; |
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 14:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz