如何强制zlib的解压缩比X字节吗?(How to force zlib to decompress

2019-10-17 22:24发布

我有一个由压缩内容加上一个32字节的头文件。 报头包含信息如时间戳,压缩后的大小,和未压缩大小。

文件本身是约490MB和头指示未压缩的大小接近2.7GB(这显然是不正确的,因为它也认为压缩后的大小为752mb)。

我剥去头和所产生的压缩的有效载荷,可与zlib的解压缩。

问题是,它仅解压缩19KB,比490MB小很多(最低限度,这是应该的,但我希望周围700MB非压缩)。

我的代码如下:

import zlib

def consume (inputFile):
    content = inputFile.read()
    print "Attempting to process " + str(len(content)) + " bytes..."
    outfile = open('output.xml', 'w')
    inputFile = zlib.decompress(content)
    print "Attempting to write " + str(len(inputFile)) + " bytes..."
    outfile.write(inputFile)
    outfile.close()

infile = open('payload', 'rb') 

consume(infile)

infile.close()

当运行,该程序的输出:

试图处理489987232个字节......试图写入18602个字节...

我试着使用zlib.decompressionobj()虽然这产生了不正确的头警告。 zlib.decompress()正常工作和生产的解压缩XML,我希望......只是过于几乎没有这种。

任何指针或建议,非常感谢!

Answer 1:

很显然你有一个损坏的文件。

您将无法强制的zlib忽略腐败,如果你做了,你最有可能获得任何垃圾700MB,或垃圾的一些随机量,或...好,这取决于腐败是什么,哪里。 但是,你可以得到任何有用的机会相当渺茫。

zlib的块不是随机accessable,或定界,或甚至字节对准; 这很难说,当你到达下一个块,除非你能够处理一个块。

另外,树木逐块增长,因此,即使你可以跳到下一个块,你的树会是错的,你会解压缩垃圾,除非你非常非常幸运,不需要的折断那个树。 更糟的是,任何块可以重新启动树(或甚至切换压缩机); 如果你错过了,你解压缩垃圾,即使得到非常幸运。 而且它不只是的事“跳过此字符串,因为我不认识它”,你甚至不知道有多少位长字符串是,如果你不承认,所以你不能跳过它。 这使我们回到第一点,你甚至不能跳过一个字符串,更不用说整个街区。

为了更好的理解,见RFC 1951年 ,它描述了使用的格式zlib 。 手动尝试通过几个简单的例子工作(只是在第一块一对夫妇的字符串,一对情侣在第二块新的),看看它是腐败他们的方式,很难撤销多么容易(除非你确切地知道他们是如何被损坏)。 这不是不可能的 (毕竟,破解加密信息是不可能的),但我不认为它可能是完全自动化的,这不是你可能为了好玩做一些事情。

如果你有重要数据(而不能只是重新下载它,回滚到以前的版本,从备份,恢复等),一些数据恢复服务声称能够恢复损坏的zlib / GZ / zip文件。 我猜这花费一只胳膊和一条腿,但它可能是正确的数据在正确的答案。

当然,我可能是错的这个不是自动化的。 有一堆压缩恢复工具在那里。 据我所知,他们都可以用破碎的zlib流做的是跳过该文件并恢复其他文件...但也许他们中的一些有一定的技巧,在某些情况下有折断流工作。



Answer 2:

你需要检查zlib.error明白为什么它停止。 为什么会停下来?



文章来源: How to force zlib to decompress more than X bytes?
标签: python zlib