我有一个解压缩 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 如何优雅地处理这个问题?
谢谢。