Так что эта супер интересная тема уже о получении исходного размера файла .gz. Получается, что размер, который можно получить из 4 байтов конца файла, «просто», чтобы убедиться, что извлечение прошло успешно. Однако: на это можно положиться, если размер извлеченных данных меньше 2 ** 32 байт. то есть. 4 ГБ.
Теперь, ЕСЛИ существует более 4 ГБ несжатых данных, в .gz должно быть несколько элементов! Последние 4 байта только указывают на несжатый размер последнего фрагмента!
Итак, как нам получить конечные байты других кусков ?
Чтение спецификаций gzip Я не вижу длины
+=======================+
|...compressed blocks...|
+=======================+
Ok. Должно зависеть от CM - метода сжатия. Что, вероятно, deflate
. Давайте посмотрим RFC об этом . Там на странице 11 написано, что есть атрибут LEN
для "несжатых блоков", но становится странно, когда они говорят о сжатых блоках ...
Я могу представить что-то вроде
full_size = os.path.getsize(gz_path)
gz = gzip.open(gz_path)
pos = 0
size = 0
while True:
try:
head_len = get_header_length(gz, pos)
block_len = get_block_length(gz, pos + head_len)
size += get_orig_size(gz, pos + head_len + block_len)
pos += head_len + block_len + 8
except:
break
print('uncompressed size of "%s" is: %i bytes' % (gz_path, full_size)
а как же get_block_length
?!? : |
Это, вероятно, никогда не предполагалось, потому что ... "потоковые данные". Но я не хочу сдаваться сейчас.
Уже один большой облом: Даже 7zip показывает такой большой .gz с точным несжатым размером только самых последних 4 байтов.
У кого-то есть другая идея?