Pergunta

De acordo com a especificação do GZ, o tamanho do arquivo é salvo nos últimos 4bytes de um arquivo .gz.

Eu criei 2 arquivos com

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

Eu os gzipe

gzip 500M 5G

Eu verifiquei os últimos 4 bytes fazendo

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

Parece que atingir a barreira invisível de 32 bits faz com que o valor seja escrito no Isize completamente sem sentido. O que é mais irritante, do que se eles tivessem usado algum erro.

Alguém sabe de uma maneira de obter o .gz Filesize não compactado do .gz sem extraí -lo?

obrigado

especificação: http://www.gzip.org/zlib/rfc-gzip.html

Editar: se alguém para experimentar, você pode usar /dev /zero em vez de /dev /urandom

Foi útil?

Solução

Não há um.

A única maneira de obter o tamanho exato de um fluxo compactado é realmente ir e descompactá -lo (mesmo que você escreva tudo para /dev /null e apenas conte os bytes).

Vale a pena notar que o ISize é definido como

Isize (tamanho da entrada)
Isso contém o tamanho da entrada original (não compactada)
Módulo de dados 2^32.

no gzip RFC Então não é realmente quebra Na barreira de 32 bits, o que você está vendo é um comportamento esperado.

Outras dicas

Eu não tentei isso com um arquivo do tamanho que você mencionou, mas muitas vezes encontro o não compactado tamanho de um arquivo .gz com

zcat file.gz | wc -c

Quando não quero deixar o arquivo não compactado por aí ou me preocupar em comprimi -lo novamente.

Obviamente, os dados não são comprovados, mas são canalizados para wc.

Vale a pena tentar, de qualquer maneira.

EDITAR: Quando tentei criar um arquivo 5g com dados de /dev /aleatório, ele produziu um arquivo 5G do tamanho 5120000000, embora meu gerente de arquivos tenha relatado isso como 4.8g

Então eu compactei com gzip 5G, os resultados 5G.gz era do mesmo tamanho (não muita compressão de aleatória dados).

Então zcat 5G.gz | wc -c relataram o mesmo tamanho do arquivo original: 5120000000 bytes. Então, minha sugestão parecia ter funcionado para este julgamento, de qualquer maneira.

Obrigado por esperar

O GZIP tem uma opção -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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top