我花了很多时间试图理解和解决这个问题,所以我认为分享它是一个好主意。问题似乎是由于未正确设置EOF字节的数据块造成的。为了解压缩缓冲区,我使用
lzma.decompress
由lzma python库提供。然而,此方法期望每个数据缓冲区都包含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库提供的函数,但有一个关键区别。如果整个缓冲区已处理,则循环将中断,
之前
检查是否达到EOF标记。
我希望这对其他人有用。