1

私は bz2_bzdecompress API を呼び出す bzip2 データを解凍する作業バージョンを持っています。それはこのようなものになります

while (bytes_input < len) {
    isDone = false;

    // Initialize the input buffer and its length
    size_t in_buffer_size = len -bytes_input;
    the_bz2_stream.avail_in = in_buffer_size;
    the_bz2_stream.next_in = (char*)data +bytes_input;

    size_t out_buffer_size =
        output_size -bytes_uncompressed;  // size of output buffer
    if (out_buffer_size == 0) {  // out of space in the output buffer
      break;
    }

    the_bz2_stream.avail_out = out_buffer_size;
    the_bz2_stream.next_out =
        (char*)output +bytes_uncompressed;  // output buffer

    ret = BZ2_bzDecompress(&the_bz2_stream);
    if (ret != BZ_OK && ret != BZ_STREAM_END) {
      throw Bzip2Exception("Bzip2 failed. ", ret);
    }

   bytes_input += in_buffer_size - the_bz2_stream.avail_in;
   bytes_uncompressed += out_buffer_size - the_bz2_stream.avail_out;

    *data_consumed =bytes_input;

    if (ret == BZ_STREAM_END) {
      ret = BZ2_bzDecompressEnd(&the_bz2_stream);
      if (ret != BZ_OK) {
        throw Bzip2Exception("Bzip2 fail. ", ret);
      }
      isDone = true;
    }
  }

これは、ネイティブの bzip2 圧縮ファイルに対してはうまく機能しますが、pbzip2 (Parallel Bzip2) および「分割可能な」bzip2 データに対しては、「BZ_PARAM_ERROR」がスローされます。

ドキュメントのpbzip2がこれを言っているのを見ます-

pbzip2 で圧縮されたデータは複数のストリームに分割され、各ストリームは次のように bzip2 圧縮されます。 --|-----|-----|-----]

pbzip2 で作成されたデータを圧縮解除するために libbzip2 を使用してソフトウェアを作成している場合は、データに複数の bzip2 ストリームが含まれていることを考慮する必要があります。そのため、各ストリームの後に libbzip2 からのストリームの終わりマーカーに遭遇し、存在するかどうかを確認するために先読みする必要があります。終了する前に処理するストリームは以上です。bzip2 プログラム自体が、この状態を自動的に処理します。

ソース: http://compression.ca/pbzip2/

誰かがこれを処理する方法を教えてもらえますか? 他の libzip2 API を使用する必要がありますか?

また、pbzip2 ファイルは、通常の「bunzip2」コマンドと互換性があります。私のコードが BZ_PARAM_ERROR をスローしている間、bzip2 はこれをどのように適切に処理しますか?

ありがとう。

4

1 に答える 1

2

その後、解凍するデータがまだ残っている場合、BZ2_bzDecompressEnd()つまり.BZ2_bzDecompressInit()bytes_input < len

|-----|各ブロックを解凍するには、 init、いくつかのdecompress呼び出し、およびend. したがって、まだ入力が残っている場合は、別のinit, n * decompress,を実行する必要がありますend

end大きなメモリ リークを避けるために、必ず final を実行してください。

初期化されていないものを使用して解凍BZ_PARAM_ERRORしようとしているため、 が発生しています。bz_stream一度やると、それをやらない限り、それ以上BZ2_bzDecompressEnd()使うことはできません。bz_streamBZ2_bzDecompressInit()

于 2016-02-11T05:50:22.647 に答える