Frage

Nach dem specific von gz die Größe der Datei in den letzten 4 Bytes einer gz-Datei gespeichert wird.

Ich habe erstellt 2 Dateien mit

dd if=/dev/urandom of=500M bs=1024 count=500000
dd if=/dev/urandom of=5G bs=1024 count=5000000

I gziped sie

gzip 500M 5G

überprüfte ich die letzten 4 Bytes zu tun

tail -c4 500M|od -I      (returns 512000000 as expected)
tail -c4 5G|od -I        (returns 825032704 as not expected)

Es scheint, dass die unsichtbare 32bit Barriere trifft, den Wert macht in den ISIZE geschrieben völlig Unsinn. Welche ärgerlicher ist, als wenn sie einige Fehler benutzt hatte, biß statt.

Kennt jemand eine Möglichkeit, die nicht komprimierten .gz Dateigröße aus dem gz zu bekommen, ohne es zu extrahieren?

Dank

Beschreibung: http://www.gzip.org/zlib/rfc-gzip. html

edit: wenn jemand, um es auszuprobieren, könnten Sie / dev / null anstelle von / dev / urandom

War es hilfreich?

Lösung

Es gibt nicht ein.

Der einzige Weg, um die genaue Größe eines komprimierten Strom zu erhalten, ist tatsächlich zu gehen und entpacken Sie es (auch wenn Sie alles nach / dev / null schreiben und rechnen nur die Bytes).

Es ist erwähnenswert, dass ISIZE ist definiert als

  

ISIZE (Input SIZE)
              Diese enthält die Größe des Originals (unkomprimiert) Eingang
              Daten Modulo 2 ^ 32.

in der gzip RFC so dass es nicht wirklich ist brechen an der 32-Bit-Schranke, was Sie sehen, Verhalten erwartet wird.

Andere Tipps

Ich habe nicht versucht, dies mit einer Datei von der Größe, die Sie erwähnten, aber ich finde oft die unkomprimiert Größe einer gz-Datei mit

zcat file.gz | wc -c

, wenn ich will nicht die unkomprimierte Datei zu liegen lassen, oder die Mühe, es wieder zu komprimieren.

Offensichtlich sind die Daten unkomprimiert, sondern wird verrohrt dann wc.

Es ist ein Versuch wert, trotzdem.

EDIT: Als ich versuchte, eine 5G-Datei mit Daten Erstellen von / dev / random es eine Datei 5G die Größe 5120000000 produziert, obwohl mein Datei-Manager dies als 4,8 g berichtete

Dann komprimierte ich es mit gzip 5G war die Ergebnisse 5G.gz die gleiche Größe (nicht viel Kompression von zufällig Daten).

Dann berichtet zcat 5G.gz | wc -c die gleiche Größe wie die Originaldatei: 5120000000 bytes. Also mein Vorschlag für diesen Versuch zu haben schien gearbeitet, sowieso.

Danke für Ihre Geduld

gzip hat eine Option -l:

       -l --list
          For each compressed file, list the following fields:

              compressed size: size of the compressed file
              uncompressed size: size of the uncompressed file
              ratio: compression ratio (0.0% if unknown)
              uncompressed_name: name of the uncompressed file

          The uncompressed size is given as -1 for files not in gzip format, such as compressed .Z files. To
          get the uncompressed size for such a file, you can use:

              zcat file.Z | wc -c

          In combination with the --verbose option, the following fields are also displayed:

              method: compression method
              crc: the 32-bit CRC of the uncompressed data
              date & time: time stamp for the uncompressed file

          The compression methods currently supported are deflate, compress, lzh (SCO compress -H) and pack.
          The crc is given as ffffffff for a file not in gzip format.

          With --name, the uncompressed name,  date and time  are those stored within the compress  file  if
          present.

          With --verbose, the size totals and compression ratio for all files is also displayed, unless some
          sizes are unknown. With --quiet, the title and totals lines are not displayed.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top