我正在开发一个iOS应用程序,它需要不时下载大约50 MB的数据。bzip2给了我最好的压缩速率(将大小缩小到8MB)。
问题是:如何解压缩应用程序中的数据?
我做了一些研究--我发现的唯一两件事是Keka (但完整的源代码不是公开的)和C++源代码的bzip2命令行工具,这对我来说太长了,太复杂了,在给我的应用程序上做了必要的调整。
我正在寻找类似http://commons.apache.org/proper/commons-compress/的东西,这是安卓版本的应用程序。
如果您知道如何使用7zip而不是bzip2来实现它,那就可以了--它只是有点不那么有效。
发布于 2013-09-10 12:25:18
只要您有一个足够好的编译器,bzip2源代码就会构建到您可以链接到的代码中的libbzip2 (我相信iOS就是这样--尽管我没有尝试.)
您需要编写的代码如下所示:
int error;
const int MAXSIZE = 4096; // Or some other decent size.
char buffer[MAXSIZE];
FILE *f = fopen("somefile.bz2", "rb");
BZFILE* b = BZ2_bzReadOpen(&error, f, 0, 0, NULL, 0);
do {
BZ2_bzRead(&error, b, buffer, MAXSIZE);
} while(error != BZ_OK);
BZ2_bzReadClose(&error, b);您可能需要添加一些检查“错误”的内容,但我认为这个概念应该有效--我只是根据文档输入了所有的代码,以及我在过去使用这个包和类似包时的经验。
发布于 2013-09-10 12:24:27
我建议您静态地链接到libbz2。在谷歌找到资料来源。
发布于 2022-06-23 05:33:16
Mats Petersson的答案指向正确的方向,但并不完整。
这一守则正在实践中:
#import "bzlib.h"
FILE * f = fopen (sourceURL.path.UTF8String, "rb");
int error;
const int MAXSIZE = 4096;
char processedBuffer [MAXSIZE];
char unprocessedBuffer [MAXSIZE];
int unprocessedCount = 0;
do
{
BZFILE * b = BZ2_bzReadOpen (& error, f, 0, 0, unprocessedBuffer, unprocessedCount);
while (error == BZ_OK)
{
int processedCount = BZ2_bzRead (& error, b, processedBuffer, MAXSIZE);
// here you do what you need with uncompressed data
for (int i = 0; i < processedCount; i ++)
printf ("%c", processedBuffer [i]);
}
void * tmpBuf;
BZ2_bzReadGetUnused (& error, b, & tmpBuf, & unprocessedCount);
for (int i = 0; i < unprocessedCount; i ++)
unprocessedBuffer [i] = ((char *) tmpBuf) [i];
BZ2_bzReadClose (& error, b);
}
while (unprocessedCount > 0 || feof (f) == NO);
fclose (f);由于我将bzip2作为源代码,需要将这些文件添加到项目中:
blocksort.c
bzlib_private.h
compress.c
crctable.c
decompress.c
huffman.c
randtable.c
bzlib.h
bzlib.chttps://stackoverflow.com/questions/18718433
复制相似问题