2016-05-23 11 views
2

圧縮されたチャンクのデータをデコードするために、ビルドされたlzma pythonを使用しています。データのチャンクによっては、次の例外が発生します。Python LZMA:ストリームの終了マーカーに達する前に圧縮データが終了しました

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

データは破損していません。それは他のツールで正しく解凍できるので、ライブラリのバグでなければなりません。同じ問題を経験し、他の人があります。

は残念ながら、どれもまだ解決策を見つけたようだありません。少なくとも、Python 3.5で動作するもの。

どうすればこの問題を解決できますか?何か回避策はありますか?

答えて

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で提供されている機能と似ていますが、大きな違いが1つあります。バッファ全体が処理された場合、ループは破損します。の前に、がEOFマークに達しているかどうかを確認してください。

私はこれが他の人に役立つことを願っています。

+0

興味深い。この場合、アルゴリズムの仕様を確認することをお勧めします。誤ってエンコードされたバッファやバッファの不正なコピーに対して、他のツールがより寛容であるように聞こえるかもしれません。スペックによっては、エラーがエンコードおよび/または伝送、NOTデコード中であることが可能です。私はちょうど提案をしています。途方もないかもしれない。 –

関連する問題