私は 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 はこれをどのように適切に処理しますか?
ありがとう。