Python LZMA:压缩数据在到达流末尾标记之前结束

时间:2016-05-23 21:07:44

标签: python python-3.x lzma

我使用内置的lzma python来解码压缩的数据块。根据数据块,我得到以下异常:

Compressed data ended before the end-of-stream marker was reached

数据未损坏。它可以使用其他工具正确解压缩,因此它必须是库中的错误。还有其他人遇到同样的问题:

不幸的是,似乎没有人找到解决方案。至少,一个适用于Python 3.5。

我该如何解决这个问题?有什么工作吗?

1 个答案:

答案 0 :(得分:1)

我花了很多时间试图理解并解决这个问题,所以我认为分享它是个好主意。这个问题似乎是由没有正确设置EOF字节的大量数据引起的。为了解压缩缓冲区,我曾经使用lzma python lib提供的lzma.decompress。但是,此方法希望每个数据缓冲区包含EOF字节,否则会引发LZMAError异常。

要解决此限制,我们可以实现一个替代解压缩函数,该函数使用LZMADecompress对象从缓冲区中提取数据。例如:

def decompress_lzma(data):
    results = []
    len(data)
    while True:
        decomp = LZMADecompressor(FORMAT_AUTO, None, None)
        try:
            res = decomp.decompress(data)
        except LZMAError:
            if results:
                break  # Leftover data is not a valid LZMA/XZ stream; ignore it.
            else:
                raise  # Error on the first iteration; bail out.
        results.append(res)
        data = decomp.unused_data
        if not data:
            break
        if not decomp.eof:
            raise LZMAError("Compressed data ended before the end-of-stream marker was reached")
    return b"".join(results)

此功能类似于标准lzma lib提供的功能,但有一个关键区别。如果整个缓冲区已经处理,则循环被破坏,之前检查我们是否达到了EOF标记。

我希望这对其他人有用。