【问题标题】:zlib: Error -3 while decompressing data: invalid distance too far backzlib:解压缩数据时出现错误-3:无效距离太远
【发布时间】:2017-03-31 20:21:13
【问题描述】:

我正在尝试编写代码来写入/读取 MS-ZIP 压缩 CAB 文件。 MS-ZIP 使用在 zlib 中实现的相同放气算法。我已将问题简化为仅涉及 zlib 的简单脚本。

  • 我知道压缩功能是正确的,因为其他 CAB 提取工具可以读取这种方式产生的文件。

  • 解压缩功能不起作用。当需要解压超过 1 个块时,它会失败。

我无法正确获取与压缩码匹配的解压码。

import sys, struct, zlib

MAX_CHUNK_SIZE = 100

def main():
    uncomp = (b'GQOLELNFJH@?AQE@LBA=?@N@<GJHE=EGE<FQOAM@?<IABT>EK'
              b'<=QFRPBSRGFRENSJLDFGD=LSRHIAO?FB@NP?DGDS>NGT@CCFPS'
              b'A@B=IGG<?JQBGBPLOPONU?IBBSNBK<QAFLGK@>H=CQ?BS><@UE'
              b'QGAKHML@>?JOSEQRCTP>S<?N>DNM@??ARJ>QUJSHLQN<P<>D==')

    print("python", sys.version)
    print("zlib version", zlib.ZLIB_VERSION)
    print("zlib runtime version", zlib.ZLIB_RUNTIME_VERSION)

    chunks = compress(uncomp)
    decomp = decompress(chunks)
    assert(uncomp == decomp)


def compress(data):
    start_off = 0
    data_size = len(data)
    remaining = data_size
    res = []
    zdict = b''

    while start_off < data_size:
        print("compress chunk %d"%len(res))

        chunk_size = min(MAX_CHUNK_SIZE, remaining)
        chunk = data[start_off:start_off+chunk_size]
        c = b''

        z = zlib.compressobj(wbits=-15, zdict=zdict)
        c += z.compress(chunk)
        c += z.flush(zlib.Z_FINISH)

        res.append(c)

        zdict = chunk
        start_off += chunk_size
        remaining -= chunk_size

    return res

def decompress(chunks):
    zdict = b''
    res = []

    for i, c in enumerate(chunks):
        print("decompress chunk %d"%i)
        out = b''

        z = zlib.decompressobj(wbits=-15, zdict=zdict)
        out += z.decompress(c)
        out += z.flush()
        zdict = out

        res.append(out)

    return b''.join(res)


if __name__ == '__main__':
    main()

当我运行这个脚本时,我得到:

python 3.4.5 (default, Jul 03 2016, 13:55:08) [GCC]
zlib version 1.2.8
zlib runtime version 1.2.8
compress chunk 0
compress chunk 1
decompress chunk 0
decompress chunk 1
Traceback (most recent call last):
  File "bug.py", line 65, in <module>
    main()
  File "bug.py", line 16, in main
    decomp = decompress(chunks)
  File "bug.py", line 55, in decompress
    out += z.decompress(c)
zlib.error: Error -3 while decompressing data: invalid distance too far back

在运行 python 3.4.3+ zlib 1.2.8 的 ideone.com http://ideone.com/baD3gg 上也失败了

【问题讨论】:

  • 我刚刚复制并粘贴了你的代码,运行它,得到了RESULTS 12/12 OK
  • (哇,嗨,马克!!)我一直收到这些错误(测试 5、6、7、8、9、10、11 有时 2、3)。运行 zlib 1.2.8。我尝试转储数据并使用 C 程序解压缩,与 python 脚本(也链接到 1.2.8)相同的结果将使用更多代码编辑我的帖子。
  • 我已经编辑了帖子。
  • 不得不添加一个import struct,但仍然始终得到RESULTS 12/12 OK
  • 确实,修复后 C 代码对我有效,但 python 脚本仍然无效。我用一个更简单的脚本(更小的块大小和提供的样本输入)更新了我的问题,但在这里失败了。会不会是 python 包装器中的错误?

标签: python zlib deflate cab


【解决方案1】:

看来我遇到了 CPython 问题 #27164。在我写这篇文章时(2016-11-21),只有分支 master 和 3.5 中提供了修复。

https://bugs.python.org/issue27164

【讨论】:

  • 确实我的python版本是3.5.2。我得到了:python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] zlib version 1.2.3 zlib runtime version 1.2.8 compress chunk 0 compress chunk 1 decompress chunk 0 decompress chunk 1
猜你喜欢
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2014-10-22
相关资源
最近更新 更多