Question

Selon le Specifiction de gz la taille du fichier est enregistré dans les dernières 4bytes d'un fichier .gz.

J'ai créé 2 fichiers avec

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

Je les gziped

gzip 500M 5G

J'ai vérifié les 4 derniers octets faisant

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

Il semble que frapper la barrière invisible 32bit, rend la valeur écrite dans le iSize complètement absurde. Ce qui est plus ennuyeux, que si elles avaient utilisé un certain bit d'erreur.

Quelqu'un sait-il d'une façon d'obtenir la taille du fichier .gz non compressé de la .gz sans l'extraire?

Merci

spécification

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

modifier: si quelqu'un pour l'essayer, vous pouvez utiliser / dev / zero au lieu de / dev / urandom

Était-ce utile?

La solution

Il n'y a pas.

La seule façon d'obtenir la taille exacte d'un flux compressé est d'aller réellement et décompressez (même si vous écrivez tout à / dev / null et il suffit de compter les octets).

Il vaut la peine de noter que iSize est défini comme

  

iSize (entrée SIZE)
              Celui-ci contient la taille de l'entrée (non compressé) d'origine
              données modulo 2 ^ 32.

dans le gzip RFC il est donc pas vraiment casser à la barrière 32 bits, ce que vous voyez est le comportement attendu.

Autres conseils

Je ne l'ai pas essayé avec un fichier de la taille que vous avez mentionné, mais je trouve souvent les non compressé taille d'un fichier .gz avec

zcat file.gz | wc -c

quand je ne veux pas quitter le fichier non compressé qui traînent, ou la peine de le comprimer à nouveau.

De toute évidence, les données non compressées, mais est ensuite canalisé vers wc.

Il vaut la peine d'essayer, de toute façon.

EDIT: Quand j'ai essayé de créer un fichier 5G avec des données de / dev / random il a produit un 5G de fichier de taille 5120000000, bien que mon gestionnaire de fichiers a rapporté ce que 4.8g

Puis je l'ai compressé avec gzip 5G, les résultats 5G.gz était la même taille (pas beaucoup de compression aléatoire données).

Alors zcat 5G.gz | wc -c a rapporté la même taille que le fichier original: 5120000000 octets. Donc, ma suggestion semble avoir travaillé pour ce procès, de toute façon.

Merci pour l'attente

gzip a une 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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top