AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Daten komprimieren bis eine bestimmte Größe erreicht wird

Daten komprimieren bis eine bestimmte Größe erreicht wird

Ein Thema von littleDave · begonnen am 20. Mär 2008 · letzter Beitrag vom 20. Mär 2008
 
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
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:13 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