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

Согласно спецификации 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

7
задан monkeyking 27 December 2009 в 09:18
поделиться

2 ответа

Нет.

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

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

ISIZE (Input SIZE)
. Содержит размер оригинального (несжатого) входа
. data modulo 2^32.

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

.
8
ответ дан 6 December 2019 в 23:06
поделиться

Я не пробовал этого с файлом такого размера, о котором вы говорили, но я часто нахожу несжатый размер 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 байт. Так что мое предложение, похоже, все равно сработало.

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

3
ответ дан 6 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: