【问题标题】:Python LZMA : Compressed data ended before the end-of-stream marker was reachedPython LZMA:压缩数据在到达流结束标记之前结束
【发布时间】:2016-05-23 21:07:44
【问题描述】:

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

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

数据没有损坏。可以用其他工具正确解压,所以肯定是库的bug。还有其他人遇到同样的问题:

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

我该如何解决这个问题?有什么解决办法吗?

【问题讨论】:

    标签: python python-3.x lzma


    【解决方案1】:

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

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

    def decompress_lzma(data):
        results = []
        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 标记。

    我希望这对其他人有用。

    【讨论】:

    • 有趣。在这种情况下,我建议检查算法的规范。听起来其他工具可能更能容忍错误编码的缓冲区或错误的缓冲区复制。根据规范,错误可能出在编码和/或传输中,而不是解码中。不过我只是提个建议。可能很遥远。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2018-09-11
    相关资源
    最近更新 更多