【发布时间】:2019-06-17 03:46:25
【问题描述】:
所以this super interesting thread 已经在获取 .gz 文件的原始大小。事实证明,可以从 4 个文件结束字节中获得的大小“只是”在那里,以确保提取成功。但是:如果提取的数据大小低于 2**32 字节,则可以依赖它。 IE。 4 GB。
现在如果有超过 4 GB 的未压缩数据,.gz 中必须有多个成员!最后4个字节只表示最后一个chunk的未压缩大小!
那么我们如何获得其他块的结束字节呢? 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 个字节。
有人有其他想法吗?
【问题讨论】: