1

我有一个解压缩 bzip2 数据的工作版本,我在其中调用 bz2_bzdecompress API。它是这样的

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(并行 Bzip2)和“可拆分”bzip2 数据,它会引发“BZ_PARAM_ERROR”。

我在他们的文档中看到 pbzip2 这么说-

使用 pbzip2 压缩的数据被分成多个流,每个流都经过 bzip2 压缩,如下所示:[-----|-----|-----|-----|-----| -----|-----|-----|-----]

如果您使用 libbzip2 编写软件来解压缩使用 pbzip2 创建的数据,则必须考虑到数据包含多个 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.

确保你做一个 final end,以避免大的内存泄漏。

你得到 a 是BZ_PARAM_ERROR因为你试图使用未初始化bz_stream的解压缩。一旦你这样做了BZ2_bzDecompressEnd(),你就不能再使用它bz_stream了,除非你BZ2_bzDecompressInit()对它做 a 。

于 2016-02-11T05:50:22.647 回答