Einzelnen Beitrag anzeigen

Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#1

Daten komprimieren bis eine bestimmte Größe erreicht wird

  Alt 20. Mär 2008, 14:28
Hallöchen erstmal,

Ich möchte in meinen Netzwerk-Protokoll eine optionale Kompression der Daten beim Senden von Dateien einbauen. Dabei habe ich folgendes Problem:

Also komprimieren funktioniert schon wunderbar, will es aber verbessern:
Ich habe eine feste Daten-Nutzgröße von 1350 Bytes. Diese möchte ich so voll wie möglich kriegen um das Netzwerk möglichst auslasten zu können. Wenn ich jetzt die Kompression einschalte, wird folgende Funktion vor dem Senden bzw nach dem Empfang ausgeführt (benutze zLibEx122):

Delphi-Quellcode:
function FileMode_CompressData(var Data; Size: word; Compress: boolean): word;
// Data: die eigentlichen Daten
// Size: die Größe von Data
// Compress: wenn TRUE, sollen die Daten komprimiert werden, ansonsten sollen sie dekomprimiert werden
var
  OutData: Pointer;
  OutSize: integer;
begin
  try
    if Compress then
    begin
      ZCompress(@Data, Size, OutData, OutSize, zcMax);
      // nur wenn die Größe der Komprimierten Daten kleiner ist,
      // sollen die komprimierten auch benutzt werden
      if OutSize < Size then
         CopyMemory(@Data, OutData, OutSize);
      result := OutSize; // neue Größe von Data zurückgeben
    end else
    begin
      ZDecompress(@Data, Size, OutData, OutSize);
      CopyMemory(@Data, OutData, OutSize);
      result := OutSize;
    end;
  finally
    if OutData <> nil then
       FreeMem(OutData);
  end;
end;
Jetzt kann es sein, dass Data nicht mehr 1350 Byte groß ist, sondern z.B. nur noch 816 Byte. Dadurch wird meine Paketgröße von 1350 aber nicht voll ausgenutzt. Was ich jetzt suche, wäre eine Funktion, die folgendes macht

Delphi-Quellcode:
Comp := TCompressionStream.Create(ms, zcMax);
while ms.Size < 1350 do // <<<<----- !!!! DAS FEHLT MIR - DIE AKTUELLE, UND ZWAR DIE WIRKLICH AKTUELLE GRÖßE VON ms
  Comp.Write(c, 1); // ein weiteres Byte einfügen
Ich kann die Funktion so bereits benutzen, doch da zLib intern mit einem Puffer von 65535 Byte arbeitet, hat ms nach dem Beenden der Schleife immer eine Größe von 65535 Bytes, was wohl etwas zu groß ist.

Ich weiß nicht ob es rein Theoretisch möglich ist, nur die ersten 1350 bytes des Streams dann zu benutzen, doch die Rechenzeit für die übrigen 64185 Bytes benötigt wird, die immer für die Katz wären, sind mir einfach zu Schade

Falls jemand eine Idee hat, wie ich das Problem lösen könnte, wäre es sehr supi, wenn er mir das zeigen könnte
  Mit Zitat antworten Zitat