AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Stream - Negative Dateigrösse (>4GB) und dessen Behandlung
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von jaikai · begonnen am 16. Nov 2012 · letzter Beitrag vom 16. Nov 2012
Antwort Antwort
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 16. Nov 2012, 10:32
Wieso global suchen und ersetzen?
Ein bissl hingucken mußt'e natürlich auch noch.

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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Nov 2012 um 10:41 Uhr)
  Mit Zitat antworten Zitat
jaikai

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

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

  Alt 16. Nov 2012, 11:44
Danke!

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

Klappt wunderbar...hehe... ich glaubs nicht...
Wenn die Programme das machen, wie's wir machen, wären sie unbrauchbar...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 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