получите размер файла очень большого файла .gz на 64-битной платформе

StackOverflow https://stackoverflow.com/questions/1965567

Вопрос

В соответствии со спецификацией gz размер файла сохраняется в последних 4 байтах файла .gz.

Я создал 2 файла с

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

Я загрузил их в zip-архив

gzip 500M 5G

Я проверил последние 4 байта , выполнив

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

Похоже, что преодоление невидимого 32-битного барьера делает значение, записанное в ISIZE, совершенно бессмысленным.Что более раздражает, чем если бы вместо этого они использовали какой-то бит ошибки.

Кто-нибудь знает способ получить несжатый размер файла .gz из файла .gz без его извлечения?

Спасибо

спецификация: http://www.gzip.org/zlib/rfc-gzip.html

Редактировать:если кто-нибудь хочет попробовать это, вы могли бы использовать /dev / zero вместо /dev / urandom

Это было полезно?

Решение

Такого не существует.

Единственный способ получить точный размер сжатого потока - это на самом деле пойти и распаковать его (даже если вы записываете все в /dev / null и просто считаете байты).

Стоит отметить, что ISIZE определяется как

ISIZE (Входной РАЗМЕР)
Это содержит размер исходного (несжатого) входного сигнала
данные по модулю 2^32.

в gzip RFC так что на самом деле это не так ломая при 32-разрядном барьере то, что вы видите, является ожидаемым поведением.

Другие советы

Я не пробовал это с файлом указанного вами размера, но я часто нахожу несжатый размер файла .gz с

zcat file.gz | wc -c

когда я не хочу оставлять несжатый файл без дела или утруждать себя его повторным сжатием.

Очевидно, что данные распаковываются, но затем передаются по конвейеру в wc.

В любом случае, попробовать стоит.

Редактировать: Когда я попытался создать файл 5G с данными из / dev / random, он создал файл 5G размером 5120000000, хотя мой файловый менеджер сообщил об этом как о 4.8G

Затем я сжал его с помощью gzip 5G, результаты 5G.gz был того же размера (не сильное сжатие Случайный данные).

Тогда zcat 5G.gz | wc -c сообщается о том же размере, что и исходный файл:5120000000 байт.Так что, во всяком случае, мое предложение, похоже, сработало в этом испытании.

Спасибо, что подождали

у gzip действительно есть опция -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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top