Frage

Ich schaffe etwas, das eine Datei-Upload-Service von Arten umfasst, und ich brauche Daten mit der zlib komprimiert speichern Kompresse () Funktion. Ich schicke es über das Internet bereits komprimiert, aber ich brauche die nicht komprimierte Dateigröße auf dem Remote-Server kennen. Gibt es eine Möglichkeit, diese Informationen ohne Dekomprimieren herausfinden kann () ing die Daten auf dem Server zunächst nur für Effizienz? Das ist, wie ich es jetzt tue, aber wenn es eine Verknüpfung ist würde ich gerne, es zu nehmen.

By the way, warum heißt es dekomprimieren? Das klingt für mich ziemlich schrecklich, ich dachte immer, es wäre zu dekomprimieren ...

War es hilfreich?

Lösung

Das zlib-Format nicht über ein Feld für die ursprüngliche Eingangsgröße, so bezweifle ich, werden Sie in der Lage sein, das zu tun, ohne eine Dekompression der Daten zu simulieren. Das gzip Format hat eine "Eingangsgröße" (ISIZE) Feld, die Sie verwenden können, aber vielleicht möchten Sie die Clients zu senden, die Dateigröße zu ändern das Komprimierungsformat oder zu vermeiden.

Aber auch wenn Sie ein anderes Format verwenden, wenn Sie die Clients nicht vertrauen würden Sie noch teurer Prüfung durchführen müssen, um sicherzustellen, dass die unkomprimierten Daten die Größe ist der Kunde sagt es ist. In diesem Fall können, was Sie tun, ist die Dekomprimieren-to / dev / null machen Prozess weniger teuer, um sicherzustellen, zlib ist die Ausgangsdaten nicht überall schreiben, da Sie nur die wollen wissen, unkomprimierte Größe.

Andere Tipps

Ich bezweifle es. Ich glaube nicht, dass dies etwas ist, die zugrunde liegenden zlib-Bibliotheken aus dem Speicher zur Verfügung stellen (obwohl es ein gutes 7 oder 8 Jahre seit ich es benutzen, die up-to-date docs scheint diese Funktion nicht, um anzuzeigen, wird hinzugefügt).

Eine Möglichkeit wäre, eine andere Datei zu übertragen, die die unkomprimierte Größe enthalten (zum Beispiel Übertragung sowohl file.zip und file.zip.size), aber das scheint voller Gefahren, vor allem wenn man die Größe falsch.

Eine weitere Alternative ist, wenn der Server Dekomprimieren zeit teuer, aber muß nicht sofort getan werden, es in einer niedrigeren Priorität Hintergrund Aufgabe tun (wie bei nice unter Linux). Aber auch hier kann es Nachteile, wenn die Größe checker hinter beginnt zu laufen (zu viele Uploads kommen in).

Und ich neige dazu, die Dekompression in Bezug auf die „explosiver Dekompression“ zu denken, keine guter Begriff zu verwenden: -)

Wenn Sie das Hochladen der rohen ‚Kompresse‘ Format verwenden, dann werden Sie keine Informationen über die Größe der Daten, die hochgeladen hat wird. Pax ist korrekt in dieser Hinsicht.
Sie können zu Beginn des Komprimierungspuffers es als 4-Byte-Header gespeichert -. Unter der Annahme, dass die Dateigröße nicht 4 GB nicht überschreitet
einig C-Code als Beispiel:

 uint8_t *compressBuffer = calloc(bufsize + sizeof (uLongf), 0);
 uLongf compressedSize = bufsize;
 *((uLongf *)compressBuffer) = filesize;
 compress(compressBuffer + sizeof (uLongf), &compressedSize, sourceBuffer, bufsize);

Dann senden Sie den kompletten compressBuffer der Größe compressedSize + sizeof (uLongf). Wenn Sie es auf der Serverseite erhalten, können Sie den folgenden Code verwenden, um die Daten zurück:

 // data is in compressBuffer, assume you already know compressed size.
 uLongf originalSize = *((uLongf *)compressBuffer);
 uint8_t *realCompressBuffer = compressBuffer + sizeof (uLongf);

Wenn Sie nicht über den Client vertrauen auf die richtige Größe zu schicken, dann müssen Sie irgendeine Art von unkomprimierter Datenprüfung auf dem Server Größe auszuführen. Der Vorschlag der Verwendung Dekomprimieren auf / dev / null ist vernünftig.
Wenn Sie eine ZIP-Datei hochladen, enthält es ein Verzeichnis, das Sie die Größe der Datei sagt, wenn es nicht komprimiert wird. Diese Informationen werden in das Dateiformat gebaut, wieder, obwohl dies für böswillige Kunden unterliegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top