Domanda

Secondo lo specifiction del gz la dimensione del file viene salvata negli ultimi 4bytes di un file .gz.

Ho creato 2 file con

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

Io li gziped

gzip 500M 5G

Ho controllato gli ultimi 4 byte facendo

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

Sembra che colpisce la barriera invisibile a 32 bit, rende il valore scritto nella iSize completamente senza senso. Che è più fastidioso, che se avessero usato qualche po 'di errore.

Qualcuno sa di un modo per ottenere la dimensione del file .gz non compressa dalla .gz, senza estrarlo?

grazie

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

modifica: se qualcuno di provarlo, è possibile utilizzare / dev / zero invece di / dev / urandom

È stato utile?

Soluzione

Non è uno.

L'unico modo per ottenere la dimensione esatta di un flusso compresso è quello di andare effettivamente e decomprimere (anche se si scrive di tutto per / dev / null e basta contare i byte).

È importante notare che iSize è definito come

  

iSize (SIZE ingresso)
              Questa contiene le dimensioni del l'ingresso originale (non compresso)
              dati modulo 2 ^ 32.

RFC quindi non è in realtà rottura alla barriera a 32 bit, il comportamento quello che stai vedendo è previsto.

Altri suggerimenti

Non ho provato questo con un file delle dimensioni che hai menzionato, ma spesso mi trovare il non compresso dimensioni di un file .gz con

zcat file.gz | wc -c

quando non voglio lasciare il file non compresso in giro, o preoccuparsi per comprimere di nuovo.

Ovviamente, i dati sono compressi, ma viene poi trasmesso al wc.

E 'la pena di provare, in ogni caso.

Modifica Quando ho cercato di creare un file di 5G con i dati da / dev / random ha prodotto un file 5G di dimensioni 5,12 miliardi, anche se il mio file manager ha segnalato questo come 4,8 g

Poi ho compresso con gzip 5G, il risultato 5G.gz era la stessa dimensione (non molto la compressione di casuale di dati).

Poi zcat 5G.gz | wc -c riferito lo stesso formato del file originale: 5120000000 byte. Quindi il mio suggerimento sembrava aver lavorato per questa prova, in ogni caso.

Grazie per l'attesa

gzip ha un opzione -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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top