Согласно спецификации gz filesize спасен в последних 4 байтах .gz файла.
Я создал 2 файла с
dd if=/dev/urandom of=500M bs=1024 count=500000
dd if=/dev/urandom of=5G bs=1024 count=5000000
Я gziped их
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 filesize от .gz, не извлекая его?
спасибо
спецификация: http://www.gzip.org/zlib/rfc-gzip.html
править: если кто-либо, чтобы испытать его, Вы могли бы использовать/dev/zero вместо/dev/urandom
Нет.
Единственный способ получить точный размер сжатого потока - это пойти и распаковать его (даже если все записать в /dev/null и просто посчитать байты).
Стоит отметить, что ISIZE определен как
ISIZE (Input SIZE)
. Содержит размер оригинального (несжатого) входа
. data modulo 2^32.
в gzip RFC, так что на самом деле это не break на 32-битном барьере, то, что вы видите - ожидаемое поведение.
.Я не пробовал этого с файлом такого размера, о котором вы говорили, но я часто нахожу несжатый размер a . gz с
zcat file.gz | wc -c
, когда я не хочу оставлять несжатый файл лежащим или пытаться сжать его снова.
Очевидно, что данные находятся в несжатом состоянии, но затем передаются в wc
.
В любом случае, стоит попробовать.
EDIT: Когда я попытался создать 5G файл с данными из /dev/random, он создал файл 5G
размера 5120000000, хотя мой файловый менеджер сообщил об этом как о 4. 8G
Затем я сжал его с помощью gzip 5G
, результат 5G.gz
был того же размера (сжатие данных случайное ).
Затем zcat 5G.gz | wc -c
сообщил тот же самый размер, что и исходный файл: 5120000000 байт. Так что мое предложение, похоже, все равно сработало.
Спасибо, что подождали