因此,已经有this super interesting thread关于获取.gz文件的原始大小的信息。事实证明,从4个文件中可以得到的大小结束字节“就在”那里,以确保提取成功。但是:如果提取的数据大小小于2 ** 32字节,则可以依靠它。即。 4 GB。
现在,如果,有超过4 GB的未压缩数据,那么.gz中必须有多个成员!最后4个字节仅指示最后一个块的未压缩大小!
那么我们如何获得其他块的结束字节? Reading the gzip specs我看不到
的长度+=======================+
|...compressed blocks...|
+=======================+
好的。必须取决于CM-压缩方法。可能是deflate
。让我们看看the RFC about it。 on page 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个字节。
有人有另一个主意吗?
答案 0 :(得分:0)
首先,不,不需要多个成员。 gzip成员的长度没有限制。如果未压缩的数据大于4 GB,则最后四个字节仅表示该长度以2 32 为模。实际上,具有4 GB以上未压缩数据的gzip文件很可能是单个成员。
第二,即使对于小的gzip文件,您可以拥有多个成员的事实也是如此。要使文件的最后四个字节无用,未压缩的数据不必超过4 GB。
可靠地确定gzip文件中未压缩数据量的唯一方法是将其解压缩。您不必写出数据,但必须处理整个gzip文件并计算未压缩字节的数量。