我使用内置的lzma python来解码压缩的数据块。根据数据块,我得到以下异常:
Compressed data ended before the end-of-stream marker was reached
数据未损坏。它可以使用其他工具正确解压缩,因此它必须是库中的错误。还有其他人遇到同样的问题:
不幸的是,似乎没有人找到解决方案。至少,一个适用于Python 3.5。
我该如何解决这个问题?有什么工作吗?
答案 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标记。
我希望这对其他人有用。